Frage zur UTF8-Dekodierung
Frage zur UTF8-Dekodierung
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
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
-
- 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
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.
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
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
-
- 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
"meistens 2 Byte" gilt vermutlich nur für "Europäische" Sprachen ?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.
"ANSI System-Codepage", also ein Byte pro Zeichen.Socke hat geschrieben:UTF8ToAnsi wandelt den String in die System-Codepage um; die kann, muss aber nicht CP1252 sein.
(Wann) Ist "ANSI System-Codepage" und "Systemkodierung" etwas unterschiedliches ? Ist die "Systemkodierung" bei Lazarus defaultmäßig UTF-8 ?Socke hat geschrieben:UTF8ToSys wandelt den übergebenen String in die Systemkodierung um; dabei versucht sie wenn möglich den Widestring-Manger zu umgehen.
-Michael
Re: Frage zur UTF8-Dekodierung
UTF8ToSys ruft auch UTF8ToAnsi auf, aber nur dann, wenn es nicht auf einem UTF8-System läuft.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.
In letzterem Falle tut UTF8ToSys nichts und gibt einfach den Input zurück.
-
- 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
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:"meistens 2 Byte" gilt vermutlich nur für "Europäische" Sprachen ?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.
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.mschnell hat geschrieben:(Wann) Ist "ANSI System-Codepage" und "Systemkodierung" etwas unterschiedliches ? Ist die "Systemkodierung" bei Lazarus defaultmäßig UTF-8 ?Socke hat geschrieben:UTF8ToSys wandelt den übergebenen String in die Systemkodierung um; dabei versucht sie wenn möglich den Widestring-Manger zu umgehen.
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
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Re: Frage zur UTF8-Dekodierung
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:
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
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;
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
Grund: richtiger Highlighter
Re: Frage zur UTF8-Dekodierung
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.
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.

Re: Frage zur UTF8-Dekodierung
Hallo theo,
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
Hm, funktioniert ja auch soweit erstmal einwandfrei. Ich würde halt nur gern auch über die Hintergründe Bescheid wissen...theo hat geschrieben:Einfach nicht zu viel grübeln.
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