XMLDocument Encoding



  • Hallo Leute,

    ich habe eine Frage betreffend des Encodings in einer XML-Datei.
    Ich benutze folgenden Code:

    _di_IXMLDocument document = interface_cast<Xmlintf::IXMLDocument>(new TXMLDocument(NULL));
    	document->Active = true;
    	document->Encoding = "UTF-8";
    
    	// Define document content.
    	document->DocumentElement = document->CreateNode("ThisIsTheDocumentElement", ntElement, "");
    	document->DocumentElement->Attributes["attrName"] = "attrValue";
    	_di_IXMLNode nodeElement = document->DocumentElement->AddChild("ThisElementHasText", -1);
    	nodeElement->Text = "Mit freundlichen Grüßen.";
    	_di_IXMLNode nodeCData = document->CreateNode("any characters here",ntCData, "");
    	document->DocumentElement->ChildNodes->Add(nodeCData);
    	_di_IXMLNode nodeText = document->CreateNode("This is a text node.",ntText, "");
    	document->DocumentElement->ChildNodes->Add(nodeText);
    
    	document->SaveToFile("C:\\temp\\testav.xml");
    

    Wenn ich den Quelltext der erstellten XML-Datei anschaue steht in der ersten Zeile

    <?xml version="1.0" encoding="UTF-8"?>
    

    schaue ich mir die Datei mit dem Edge-Browser an zeigt er mir

    <?xml version="1.0" encoding="ISO-8859-1"?>
    

    wie kann das sein? Bin für jede Hilfe dankbar.

    Auch mit der XMLDocument Komponente direkt das gleiche Phänomen ??
    Danke im voraus.



  • @andivdeu
    Offenbar liest der Browser nicht die Attribute des XML-Tags, sondern versucht anhand des Inhalts der Datei zu erkennen, in welchem Format sie ist. Letzteres kann übrigens schwierig sein und geht oft schief. Ergo: mieser Browser. Probiere es mal mit einem anderen.



  • Geraten: du behauptest zwar, UTF-8 zu schreiben, deine freundlichen Grüßen werden aber tatsächlich als ISO-8859-1 in die Datei geschrieben.



  • @rbs2
    Danke für schnelle die Antwort, ich habe statt dem MS-Edge den alten IE11 genommen und der
    zeigt

    <?xml version="1.0" encoding="UTF-8"?>
    


  • @manni66 wie könnte ich denn sicherstellen das ein String nicht in ISO-8859-1 in die Datei geschrieben wird ?



  • @andivdeu sagte in XMLDocument Encoding:

    @rbs2
    Danke für schnelle die Antwort, ich habe statt dem MS-Edge den alten IE11 genommen und der
    zeigt

    <?xml version="1.0" encoding="UTF-8"?>
    

    Was nicht unbedingt die Vermutung von @manni66 wiederlegt. Zumindest zeigt IE11 an, was Du sehen möchtest.



  • @andivdeu sagte in XMLDocument Encoding:

    @manni66 wie könnte ich denn sicherstellen das ein String nicht in ISO-8859-1 in die Datei geschrieben wird ?

    Keine Ahnung, ich kenne die verwendetetn Klassen nicht.



  • @manni66
    Wenn er nur "normale" Zeichen verwendet, kann der Browser auch nur raten.

    @andivdeu
    Setz mal das an den Anfang deiner Datei:
    https://de.wikipedia.org/wiki/Byte_Order_Mark



  • @rbs2 sagte in XMLDocument Encoding:

    @manni66
    Wenn er nur "normale" Zeichen verwendet, kann der Browser auch nur raten.

    Wenn nur ASCII enthalten ist, ist UTF-8 identisch mit ISO-8859-1. Warum soll der Browser dann raten?



  • @manni66
    Weil dann die Ü's und Ä's plötzlich komisch aussehen.
    Wenn die Kodierung in der XML-Deklaration drin steht, sollte der Browser das auch übernehmen.



  • @rbs2 sagte in XMLDocument Encoding:

    Wenn die Kodierung in der XML-Deklaration drin steht, sollte der Browser das auch übernehmen.

    Das Web funktioniert anders. Die Browser versuchen alless zu reparieren. Leider.



  • @manni66 sagte in XMLDocument Encoding:

    Die Browser versuchen alless zu reparieren. Leider.

    Der sogenannte Quirks-Mode? Ist ja oft sinnvoll, schließlich existiert viel schrottiges HTML.

    Aber einen Browser, der ein explizit angegebenes Encoding ignoriert, würde ich schon als ziemlich Buggy bezeichnen.



  • @rbs2 Hab den Code mal geändert, wegen des BOM:

    TStringList *strlist;
    	strlist = new TStringList();
    	//strlist->DefaultEncoding = TEncoding::UTF8;
    
    
    	_di_IXMLDocument document = interface_cast<Xmlintf::IXMLDocument>(new TXMLDocument(NULL));
    	document->Active = true;
    	document->Encoding = "UTF-8";
    	document->Options = XMLDocument1->Options << doNodeAutoIndent;
    
    	// Define document content.
    	document->DocumentElement = document->CreateNode("ThisIsTheDocumentElement", ntElement, "");
    	document->DocumentElement->Attributes["attrName"] = "attrValue";
    	_di_IXMLNode nodeElement = document->DocumentElement->AddChild("ThisElementHasText", -1);
    	nodeElement->Text = "Mit freundlichen Grüßen.";
    	_di_IXMLNode nodeCData = document->CreateNode("any characters here",ntCData, "");
    	document->DocumentElement->ChildNodes->Add(nodeCData);
    	_di_IXMLNode nodeText = document->CreateNode("This is a text node.",ntText, "");
    	document->DocumentElement->ChildNodes->Add(nodeText);
    
    	AnsiString dateiname = "C:\\temp\\testav.xml";
    	document->SaveToFile(dateiname);
    
    	strlist->Add(document->XML->Text);
    	strlist->SaveToFile(dateiname, TEncoding::UTF8);
    

    und im Hexview wird folgendes als Decodierter Text angezeigt:

    <?xml version="1.0"?>
    <ThisIsTheDocumentElement attrName="attrValue">
      <ThisElementHasText>Mit freundlichen Grüßen.</ThisElementHasText>
      <![CDATA[any characters here]]>
    This is a text node.</ThisIsTheDocumentElement>
    

    nun steht der UTF-8 BOM am Anfang der Datei und wird vom MS-Edge immer noch als ISO-8859-1 interpretiert,
    der IE11 zeigt nur noch

    <?xml version="1.0"?>
    


  • @andivdeu sagte in XMLDocument Encoding:

    MS-Edge

    Das Problem kennt man schon bei Mickrigsoft:

    https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/17670157/

    Um die Antworten zu sehen, musste dich anmelden.



  • Vielen Dank für Eure Hilfe.