Delphi-PRAXiS
Seite 1 von 2  1 2   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi XML Document encoding (https://www.delphipraxis.net/207657-xml-document-encoding.html)

Klaus01 20. Apr 2021 15:08

XML Document encoding
 
Hallo,
ich frage mich warum das encoding nicht in das xml eingetragen wird:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  xmlDoc: IXmlDocument;
  s: String;
begin
  coInitialize(nil);
  xmlDoc := TXmlDocument.Create(nil);
  try
    xmlDoc.Active := true;
    xmldoc.Encoding := 'ISO-8859-15';
    xmlDoc.AddChild('test');
    xmlDoc.SaveToXML(s);
    memo1.Lines.Text := s;
  finally
    xmlDoc.Active := false;
    coUnInitialize;
  end;
end;
Code:
<?xml version="1.0"?>
<test/>
wenn ich das encoding auf 'UTF-16' ändere wird es im XML eingetragen.
Wie kann ich das ändern - warum ist das so?
Code:
<?xml version="1.0" encoding="UTF-16"?>
<test/>
Grüße
Klaus

Olli73 20. Apr 2021 17:55

AW: XML Document encoding
 
Macht es einen Unterschied, wenn du direkt in eine Datei schreibst?

String ist nunmal Unicode.

Klaus01 20. Apr 2021 20:33

AW: XML Document encoding
 
.. in der Datei wird das korrekte Encoding angezeigt.

Code:
<?xml version="1.0" encoding="ISO-8859-15"?>
<test/>
.. ich dachte das Encondig sollte sicherstellen, dass die XML Daten richtig gelesen werden,
unabhängig davon wie die Daten transportiert werden.

Grüße
Klaus

Rolf Frei 21. Apr 2021 19:48

AW: XML Document encoding
 
Das Encoding besagt in welchem Econding die Daten im File gespeichert sind. Hast du also Texte mit Umlauten und Encoding="ISO-8859-15" müssen diese im gleichen Encoding gepseichert sein, wie du da angibst. Soweit ich weiss macht das XML Doc das dann automatisch für dich, bin mir hier aber nicht zu 100% sicher. Ist leider schon einige Zeit her, seit ich zuletzt mit dem XML Doc Klassen gearbeitet habe. Per Default ist UTF-8 übrignens der Standard bei XML Files ohne Encoding Header.

Was ist denn nun eigentlich dein Problem genau? Du sagst ja selber im letzten Post, dass das Encoding da ist.

Klaus01 21. Apr 2021 20:12

AW: XML Document encoding
 
.. nun ich muss die xml Daten als String/Widestring weitergeben. Da ist nur UTF-8 oder UTF-16 möglich.
Egal welches Encoding als XML Attribute eingestellt wurde.

.. oder ist nur der welcher als letzte Instanz die Daten abspeichert für das korrekte Encoding zustämdig?
Dann hätte ich kein Problem.

Grüße
Klaus

Rolf Frei 22. Apr 2021 13:02

AW: XML Document encoding
 
Sorry aber nun verstehe ich nicht mehr so ganz was du genau machen willst. Was bedeutet das "letzte Instanz"? Beim Ertellen der XML musst du die Daten im glechen Enconding speichern, wie du da im XML Header angibst. Alles andere muss dich nicht mehr interessieren. Das Einlesend der XML muss sich dann darum kümmern, dass er die Daten entprechend dem Encoding Header entsprechend decodiert und einliest. Das alles mach aber in der Regel die XML Engine automatisch.

Wenn du Unicodetext übergeben willst, nutze UTF-8 als Enoding oder lass es komplett weg, da das der Default ist. Das XML Doc macht dann aus dinem String automatisch ein UTF-8 XML. UTF-16 brauchst du nicht und ISO-8859-15 ist ein ANSI Encoding und solltest du daher auch nicht nutzen, wenn du Unicode Daten hast.

Poste doch mal den Code den du bisher geschrieben hast.Dein leines Beissöiel von oben ist so eh nicht funktionsfähig, da du da xmlDoc.SaveToXML(s) drin hast und da ist s ein leerer String, müsste aber der Dateiname sein. Im Memo zeigst du dann das s and?! Um zu prüfen, ob die Datei richtig gespeichert ist, musst du sie in einem Editor laden, der dir anzeigen kann wie die Datei encodet ist. Wenn da UTF-8 angezeigt wird und alle Umlaute korrekt angezeigt werden ist alle richtig.

KodeZwerg 22. Apr 2021 14:20

AW: XML Document encoding
 
Zitat:

Zitat von Rolf Frei (Beitrag 1487586)
UTF-16 brauchst du nicht und ISO-8859-15 ist ein ANSI Encoding und solltest du daher auch nicht nutzen, wenn du Unicode Daten hast.

Ich benötige das schon sehr oft.
Ich lade xml daten aus dem internet und bekomme es als ansi-codiert. in meinem programm wandle ich es in unicode zurück.
Die gleiche vorgehensweise muss ich durchführen um daten zu diesem server zu senden.
Da muss ich mein unicode erst wieder in ansi umwandeln damit es funktioniert.

Aber vielleicht habe ich dich auch falsch verstanden, dann ignoriere es.

Rolf Frei 22. Apr 2021 14:32

AW: XML Document encoding
 
So wie sich dein Beitrag liest, machst du das ganze XML Handling selber ohne XMLDocument. Ja, in dem Fall musst das alles selber hin und her codieren. Mit der TXMLDocument Klasse passiert das aber automatisch gemäss dem Encoding Header und da kommt hinten immer ein fertiger Delphi String retour. (Müsste mich irren, wenn das nicht so wäre)

In diesem Fall hier geht es aber um das Erstellen einer XML Datei mit TXMLDocument und nicht dem Einlesen, wenn ich es richtig verstanden habe.

KodeZwerg 22. Apr 2021 14:36

AW: XML Document encoding
 
So decodiere ich:
Delphi-Quellcode:
var
   XmlDoc : OleVariant;
   Node  : OleVariant;
begin
  XmlDoc:= CreateOleObject(Msxml2_DOMDocument);
  try
    XmlDoc.Async := False;
    XmlDoc.LoadXML({Das XML Document hier rein});
    if (XmlDoc.parseError.errorCode <> 0) then
     raise Exception.CreateFmt('Error in Xml Data %s',[XmlDoc.parseError]);
    Node:= XmlDoc.documentElement;
    if not VarIsClear(Node) then
      Result := TEncoding.UTF8.GetString(TEncoding.ANSI.GetBytes(string(XmlDoc.Text)));
  finally
     XmlDoc:=Unassigned;
  end;
end;
Kodieren geht genauso nur rückwärts.

Rolf Frei 22. Apr 2021 15:04

AW: XML Document encoding
 
Ja so wie du das da direkt mit den MS XML Interfaces machst, musst du selber dafür sorgen, dass es richtig codiert. Die TXMLDocument Klasse würde dir diese Arbeit aber abnehmen und du könntest erst noch andere XML Engines nutzen, als die von MS.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:40 Uhr.
Seite 1 von 2  1 2   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz