Falsche Zeichenkodierung in XML-Dokumenten

Zur Vorstellung von Komponenten und Units für Lazarus
Antworten
Kay
Beiträge: 134
Registriert: So 14. Nov 2010, 15:17

Falsche Zeichenkodierung in XML-Dokumenten

Beitrag von Kay »

Hallo,

ich habe ein Problem bei der Zeichenkodierung von XML-Dokumenten. Ich habe folgende Beispielmethode erstellt:

Code: Alles auswählen

procedure Test;
var
  XMLDocument: TXMLDocument;
  RootNode, ChildNode: TDOMNode;
  TextNode: TDOMText;
begin
  XMLDocument := TXMLDocument.Create;
  try
    RootNode := XMLDocument.CreateElement('route');
    XMLDocument.AppendChild(RootNode);
    RootNode := XMLDocument.DocumentElement;
    ChildNode := XMLDocument.CreateElement('richtung');
    RootNode.AppendChild(ChildNode);
    TextNode := XMLDocument.CreateTextNode('süden');
    ChildNode.AppendChild(TextNode);
    WriteXMLFile(XMLDocument, 'Test.xml');
  except
  end;
  if XMLDocument <> nil then XMLDocument.Free;
end;


Nun habe ich versucht, das erzeugte Dokument im Office zu öffnen. Dazu habe ich bei der Nachfrage als Zeichenkodierung UTF-8 ausgewählt. Die Datei wird korrekt geöffnet, der Umlaut "ü" wird allerdings nicht korrekt dargestellt. Kann es sein, dass das Dokument gar nicht in UTF-8 vorliegt und wenn das so ist, was müsste ich korrigieren?

Vielen Dank und viele Grüße
Zuletzt geändert von Lori am Mo 2. Jul 2012, 10:25, insgesamt 1-mal geändert.
Grund: richtiger Highlighter

gocher
Beiträge: 298
Registriert: Di 23. Nov 2010, 23:41
OS, Lazarus, FPC: Ubuntu/Win, Lazarus trunk, FPC trunk
CPU-Target: 32Bit/64Bit
Wohnort: Geldern
Kontaktdaten:

Re: Falsche Zeichenkodierung in XML-Dokumenten

Beitrag von gocher »

Hallo Kay,

kurzes Testprogramm, es funktioniert wenn man Rechtsklick im Lazarus Editor, Dateieinstellungen, Zeichenkodierung, Ansi (cp1252) auswählt!

Code: Alles auswählen

program Project1;
 
{$mode objfpc}{$H+}
 
uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes
  { you can add units after this }, DOM, XMLWrite;
 
var
  XMLDocument: TXMLDocument;
  RootNode, ChildNode: TDOMNode;
  TextNode: TDOMText;
begin
  XMLDocument := TXMLDocument.Create;
  try
    RootNode := XMLDocument.CreateElement('route');
    XMLDocument.AppendChild(RootNode);
    RootNode := XMLDocument.DocumentElement;
    ChildNode := XMLDocument.CreateElement('richtung');
    RootNode.AppendChild(ChildNode);
    TextNode := XMLDocument.CreateTextNode('süden');
    ChildNode.AppendChild(TextNode);
    WriteXMLFile(XMLDocument, 'Test.xml');
  except
  end;
end.
MfG Gocher
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Falsche Zeichenkodierung in XML-Dokumenten

Beitrag von theo »

gocher hat geschrieben:kurzes Testprogramm, es funktioniert wenn man Rechtsklick im Lazarus Editor, Dateieinstellungen, Zeichenkodierung, Ansi (cp1252) auswählt!


Nee, das ist Gemurkse. Unicode auf gut Glück ohne vernünftige Begründung ist eigentlich immer schlecht. :wink:

So wäre besser (Editor auf UTF-8 belassen):

Code: Alles auswählen

TextNode := XMLDocument.CreateTextNode(UTF8Decode('süden'));


XMLDocument arbeitet mit WideString, der Editor standardmässig mit UTF-8, also UTF-8 nach WideString wandeln mit UTF8Decode.

gocher
Beiträge: 298
Registriert: Di 23. Nov 2010, 23:41
OS, Lazarus, FPC: Ubuntu/Win, Lazarus trunk, FPC trunk
CPU-Target: 32Bit/64Bit
Wohnort: Geldern
Kontaktdaten:

Re: Falsche Zeichenkodierung in XML-Dokumenten

Beitrag von gocher »

theo hat geschrieben:Nee, das ist Gemurkse. Unicode auf gut Glück ohne vernünftige Begründung ist eigentlich immer schlecht. :wink:

Die Begründung liegt doch auf der Hand wenn die Sourcen schon das richtige Format haben braucht man nicht zu Konvertieren (Ansistring -> Widestring, der Ansistring wird vom Widestringmanager unter Verwendung der aktuellen Systemcodierung in utf-16 gewandelt) und falls die Standard Komponente um XML Dateien zu erstellen UTF8 jetzt noch nicht als Eingabe unterstützt, dann doch bestimmt in naher Zukunft (sonst würde sie wohl keiner mehr nutzen, ich nutze sie im Augenblick schon nicht mehr), dann braucht man nur die Codierung des Sourcecodes zu ändern und nicht alle UTF8Decode zu entfernen. Ich gehe davon aus das die XML-Datei nicht komplett aus Source-Code generiert wird, sondern auch aus Dateien und/oder Datenbanken und dann ist das UTF8Decode vielleicht nicht überall zu entfernen. Sicherlich hast du recht wenn man System unabhängig denkt ist UTF8 auch meine erste Wahl!
MfG Gocher
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Falsche Zeichenkodierung in XML-Dokumenten

Beitrag von theo »

Wieso sollte ich über eine 1Byte Codierung gehen, wenn ich direkt Unicode (UTF-8) zu Unicode (UTF-16) wandeln kann?
Die genannten XML Units sind Teil der FCL und werden deshalb kaum je nach UTF-8 umgeschrieben werden.
Und bei Unicode liegt nichts "auf der Hand". :wink:
Also immer leise bleiben...

gocher
Beiträge: 298
Registriert: Di 23. Nov 2010, 23:41
OS, Lazarus, FPC: Ubuntu/Win, Lazarus trunk, FPC trunk
CPU-Target: 32Bit/64Bit
Wohnort: Geldern
Kontaktdaten:

Re: Falsche Zeichenkodierung in XML-Dokumenten

Beitrag von gocher »

theo hat geschrieben:Nee, das ist Gemurkse. Unicode auf gut Glück ohne vernünftige Begründung ist eigentlich immer schlecht. :wink:

Noch einmal ich habe nur zuvor erklärt wie die von mir gewählte Variante funktioniert (also die Begründung und die Erklärung wieso es nicht nur gut Glück ist), ob es Gemurkse ist das ist subjektiv deshalb kam meine Begründung wieso ich es anders gehandhabt habe. Bei mir wird solch ein Code jetzt auch in UTF-8 geschrieben, aber ohne Konvertierung denn mein DOM-Objekt unterstützt auch UTF-8! Als ich meine Projekte von Delphi nach Lazarus portiert habe bin ich ähnlich vorgegangen, dann als ich die eigene DOM-Klasse fertig hatte brauchte ich meine ganzen Projekte nur nach UTF-8 konvertieren und sie funktionierten auf Anhieb!
Also wieso:
theo hat geschrieben:Also immer leise bleiben...
, war ich laut :?:
Und jetzt ganz leise, lass Kay doch entscheiden wie viel Arbeit er sich machen will und welchen Weg er nimmt.
Das ist meine letzte Zeile zu diesem Thema!
MfG Gocher
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Falsche Zeichenkodierung in XML-Dokumenten

Beitrag von Socke »

Wenn ich hier einen Link auf den Free Pascal Programmers Guide ohne Kommentar hineinstelle, wird das vermutlich nichts.

http://www.freepascal.org/docs-html/prog/progsu81.html#x88-870001.2.5

Man kann dem FPC nämlich mitteilen, welche CodePage der Quelltext hat. Es gibt also generell zwei Möglichkeiten:
  1. Man Ändert den Quelltext auf die Systemkodierung (CP1252 unter Windows, UTF-8 unter Linux, usw.)
  2. Man bleibt bei allen Systemen bei UTF-8 und meldet dies dem Compiler
In beiden Fällen wird das korrekte Ergebnis erzeugt.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein


Antworten