Frage zur UTF8-Dekodierung

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Kay
Beiträge: 134
Registriert: So 14. Nov 2010, 15:17

Frage zur UTF8-Dekodierung

Beitrag von Kay »

Hallo,

könnte mir vielleicht jemand den genauen Unterschied zwischen den Funktionen UTF8ToSys, UTF8ToAnsi und UTF8Decode erklären? Im Grunde wird doch letztlich immer die Funktion UTF8Decode aufgerufen und die übergebene Zeichenfolge von UTF-8 nach CP-1252 gewandelt oder?

Vieldn Dank
Kay

Socke
Lazarusforum e. V.
Beiträge: 3178
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: Frage zur UTF8-Dekodierung

Beitrag von Socke »

Die Funktion UTF8Decode kodiert den String als UTF16 neu. In UTF16 benötigten die meisten Zeichen der gesprochenen Sprachen je 2 Byte. In UTF-8 benötigen diese eine unterschiedliche Anzahl an Bytes.
UTF8ToAnsi wandelt den String in die System-Codepage um; die kann, muss aber nicht CP1252 sein.
UTF8ToSys wandelt den übergebenen String in die Systemkodierung um; dabei versucht sie wenn möglich den Widestring-Manger zu umgehen.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Frage zur UTF8-Dekodierung

Beitrag von mschnell »

Socke hat geschrieben:Die Funktion UTF8Decode kodiert den String als UTF16 neu. In UTF16 benötigten die meisten Zeichen der gesprochenen Sprachen je 2 Byte. In UTF-8 benötigen diese eine unterschiedliche Anzahl an Bytes.
"meistens 2 Byte" gilt vermutlich nur für "Europäische" Sprachen ?
Socke hat geschrieben:UTF8ToAnsi wandelt den String in die System-Codepage um; die kann, muss aber nicht CP1252 sein.
"ANSI System-Codepage", also ein Byte pro Zeichen.
Socke hat geschrieben:UTF8ToSys wandelt den übergebenen String in die Systemkodierung um; dabei versucht sie wenn möglich den Widestring-Manger zu umgehen.
(Wann) Ist "ANSI System-Codepage" und "Systemkodierung" etwas unterschiedliches ? Ist die "Systemkodierung" bei Lazarus defaultmäßig UTF-8 ?

-Michael

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

Re: Frage zur UTF8-Dekodierung

Beitrag von theo »

Socke hat geschrieben: UTF8ToAnsi wandelt den String in die System-Codepage um; die kann, muss aber nicht CP1252 sein.
UTF8ToSys wandelt den übergebenen String in die Systemkodierung um; dabei versucht sie wenn möglich den Widestring-Manger zu umgehen.
UTF8ToSys ruft auch UTF8ToAnsi auf, aber nur dann, wenn es nicht auf einem UTF8-System läuft.
In letzterem Falle tut UTF8ToSys nichts und gibt einfach den Input zurück.

Socke
Lazarusforum e. V.
Beiträge: 3178
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: Frage zur UTF8-Dekodierung

Beitrag von Socke »

mschnell hat geschrieben:
Socke hat geschrieben:Die Funktion UTF8Decode kodiert den String als UTF16 neu. In UTF16 benötigten die meisten Zeichen der gesprochenen Sprachen je 2 Byte. In UTF-8 benötigen diese eine unterschiedliche Anzahl an Bytes.
"meistens 2 Byte" gilt vermutlich nur für "Europäische" Sprachen ?
Nein, in UTF-16 können alle Zeichen der Basic multilingual Plane mit 2 Bytes kodiert werden. Darin sind neben den lateinischen auch CJK, arabische, kyrillische Schriftzeichen (und jede Menge mehr) enthalten. Für die meisten Programme des alltäglichen Gebrauchs reicht das vollkommen aus.
mschnell hat geschrieben:
Socke hat geschrieben:UTF8ToSys wandelt den übergebenen String in die Systemkodierung um; dabei versucht sie wenn möglich den Widestring-Manger zu umgehen.
(Wann) Ist "ANSI System-Codepage" und "Systemkodierung" etwas unterschiedliches ? Ist die "Systemkodierung" bei Lazarus defaultmäßig UTF-8 ?
Lazarus kennt keine Systemkodierung. Die Lazarus Component Library (LCL; der Teil deiner Anwendung, der von Lazarus kommt und für die grafischen Komponenten zuständig ist) definiert, dass alle Strings in UTF-8 kodiert sein müssen.
Die Runtime Library (RTL; wird vom Free Pascal Compiler mitgebracht) besitzt eine Systemkodierung, da hier die Strings direkt an das Betriebssystem weitergereicht werden
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Kay
Beiträge: 134
Registriert: So 14. Nov 2010, 15:17

Re: Frage zur UTF8-Dekodierung

Beitrag von Kay »

Hallo,

erstmal vielen Dank für eure Antworten. Die Anwendung der verschiedenen Funktionen habe ich verstanden.
Nun habe ich allerdings noch ein anderes Problem:
Ich möchte eine Webseite mit Hilfe der Klasse TXMLDocument erzeugen. Im Forum habe ich den Tipp erhalten, die Funktion UTF8Decode anzuwenden, damit beispielsweise Umlaute hierbei korrekt codiert werden:

Code: Alles auswählen

uses
  dom, xmlwrite;
 
procedure TForm1.FormCreate(Sender: TObject);
var
  XMLDoc: TXMLDocument;
  HtmlNode, HeadNode, BodyNode, TagNode: TDOMNode;
  TextNode: TDOMText;
begin
  XMLDoc := TXMLDocument.Create;
  HtmlNode := XMLDoc.CreateElement('html');
  XMLDoc.AppendChild(HtmlNode);
  HtmlNode := XMLDoc.DocumentElement;
  HeadNode := XMLDoc.CreateElement('head');
  HtmlNode.AppendChild(HeadNode);
  TagNode := XMLDoc.CreateElement('title');
  HeadNode.AppendChild(TagNode);
  TextNode := XMLDoc.CreateTextNode('Test');
  TagNode.AppendChild(TextNode);
  BodyNode := XMLDoc.CreateElement('body');
  HtmlNode.AppendChild(BodyNode);
  TagNode := XMLDoc.CreateElement('p');
  BodyNode.AppendChild(TagNode);
  TextNode := XMLDoc.CreateTextNode(UTF8Decode('Größe'));
  TagNode.AppendChild(TextNode);
  WriteXMLFile(XMLDoc, 'test.html');
  XMLDoc.Free;
end;
Wenn ich nun die gespeicherte Seite im IE öffne, bekomme ich als Zeichenkodierung UTF-8 angezeigt - so wie es sein soll. Der Text ist auch einwandfrei leserlich.
Was ich mich nun allerdings frage ist, wie das sein kann. Wenn ich den obigen Erläuterungen folge, codiert doch UTF8Decode die Zeichenfolge nach UTF-16? Ist das nicht eigentlich falsch? Und wieso muss ich überhaupt UTF8Decode ausführen, die Zeichenfolge liegt ja schon in UTF-8 vor und das resultierende XML-Dokument soll auch in UTF-8 codiert sein. Das finde ich etwas verwirrend...

Viele Grüße
Kay
Zuletzt geändert von Lori am Mi 25. Jul 2012, 12:49, insgesamt 1-mal geändert.
Grund: richtiger Highlighter

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

Re: Frage zur UTF8-Dekodierung

Beitrag von theo »

Die XML Klassen arbeiten einfach mit UTF-16.
Du hast recht, dass das eine hin- und her Umwandlerei ist, ist aber so.
Es sind halt FCL Klassen, und die haben sich nicht wie Lazarus auf UTF-8 festgelegt.
Einfach nicht zu viel grübeln. :wink:

Kay
Beiträge: 134
Registriert: So 14. Nov 2010, 15:17

Re: Frage zur UTF8-Dekodierung

Beitrag von Kay »

Hallo theo,
theo hat geschrieben:Einfach nicht zu viel grübeln. :wink:
Hm, funktioniert ja auch soweit erstmal einwandfrei. Ich würde halt nur gern auch über die Hintergründe Bescheid wissen...
Wenn ich das also richtig verstehe, wird die von Lazarus in UTF-8 codierte Zeichenfolge mittels UTF8Decode nach UTF-16 "konvertiert", damit diese von der FCL korrekt verarbeitet werden kann. So und in der DOM-Klasse wird die Zeichenfolge wieder nach UTF-8 gewandelt, damit das resultierende XML-Dokument korrekt codiert ist. Wenn das so stimmt, dann wäre mir die Sache jetzt klar.

Vielen Dank und viele Grüße
Kay

Antworten