Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Problem mit UTF-8 Bytes (https://www.delphipraxis.net/132339-problem-mit-utf-8-bytes.html)

PeterPanino 10. Apr 2009 02:46


Problem mit UTF-8 Bytes
 
Hallo, ich habe gerade gemerkt, dass Webbrowser (Firefox, IE) die deutschen Umlaute fehlerhaft darstellen, wenn der HTML-Datei nicht die 3 UTF-8 Erkennungs-Bytes ($EF $BB $BF) vorangestellt sind.

Die HTML-Datei hat folgende Kennung:

Zitat:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
<meta content="de" http-equiv="Content-Language" />
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
Wenn ich eine Stringliste mit der Methode SaveToFile speichere, werden die 3 Bytes natürlich nicht gespeichert. Auch der Versuch, die 3 Bytes manuell einzufügen, scheitert: Der Browser stellt die Umlaute dann immer noch fehlerhaft dar:

Delphi-Quellcode:
MyStringList[0] := Chr($EF) + Chr($BB) + Chr($BF) + MyStringList[0];
Aber trotzdem wird die Datei in einem Hex-Editor ganz normal mit den 3 Bytes am Anfang dargestellt!!!

jaenicke 10. Apr 2009 03:24

Re: Problem mit UTF-8 Bytes
 
Diese Bytes sind ja nicht das Entscheidende, sondern die Codierung als UTF-8, und die hast du bisher ja nicht gezeigt. Zudem kann man das glaube ich auch im Header noch einmal setzen, der mit der Datei geschickt wird (per PHP ggf.). Der sollte natürlich auch auf UTF-8 lauten. Wie hast du die denn gemacht? Dies funktioniert jedenfalls problemlos, auch ohne diese Bytes:
Delphi-Quellcode:
var
  test: TStringList;
begin
  test := TStringList.Create;
  test.Text := Utf8Encode('<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">'
    + #13#10'<html xmlns="http://www.w3.org/1999/xhtml">'
    + #13#10'<head>'
    + #13#10'<meta http-equiv="Content-Language" content="de" />'
    + #13#10'<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />'
    + #13#10'<title>Example</title>'
    + #13#10'</head>'
    + #13#10'<body>'
    + #13#10'Das ist ein Text mit ä, ö und ü als Umlaute drin.'
    + #13#10'</body>'
    + #13#10'</html>');
  test.SaveToFile('b:\xyz.html');
  test.Free;
Die Bytes kannst du natürlich zusätzlich auch hinzufügen.

mjustin 10. Apr 2009 06:15

Re: Problem mit UTF-8 Bytes
 
Zitat:

Zitat von PeterPanino

Wenn ich eine Stringliste mit der Methode SaveToFile speichere, werden die 3 Bytes natürlich nicht gespeichert.

SaveToFile hat einen zweiten Parameter zur Angabe des Encodings:

Delphi-Quellcode:
SaveToFile('filename.ext', TEncoding.UTF8);
sollte funktionieren ...

Cheers,

jaenicke 10. Apr 2009 06:45

Re: Problem mit UTF-8 Bytes
 
// EDIT:
Ich hatte den falschen Link angeschaut.

Das ist neu in Delphi 2009. Aber in früheren Versionen von Delphi gibts das nicht. Da hier im Profil ja 2009 steht, ist das also das richtige.

PeterPanino 10. Apr 2009 13:56

Re: Problem mit UTF-8 Bytes
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von mjustin
SaveToFile hat einen zweiten Parameter zur Angabe des Encodings:

Delphi-Quellcode:
SaveToFile('filename.ext', TEncoding.UTF8);
sollte funktionieren ...

Cheers,

VIELEN DANK! Jetzt funktioniert's! Aber wieso wird dieser Parameter nicht in der Parameterliste im Tooltip dieser Methode angezeigt?:

http://img518.imageshack.us/img518/6393/savetofile.gif

[edit=mkinzler]Img-Tag durch Url-Tag ersetzt, Bild angehängt Mfg, mkinzler[/edit]

mjustin 10. Apr 2009 14:24

Re: Problem mit UTF-8 Bytes
 
Zitat:

Zitat von PeterPanino
Zitat:

Zitat von mjustin
SaveToFile hat einen zweiten Parameter zur Angabe des Encodings:

Delphi-Quellcode:
SaveToFile('filename.ext', TEncoding.UTF8);
sollte funktionieren ...

Cheers,

VIELEN DANK! Jetzt funktioniert's! Aber wieso wird dieser Parameter nicht in der Parameterliste im Tooltip dieser Methode angezeigt?:

http://img518.imageshack.us/img518/6393/savetofile.gif

Delphi ToolTips sind ja nicht gerade ein Highlight ...

Wenn man SL.SaveToFile(); schreibt und die Einfügemarke (Caret) zwischen die Klammern setzt und dann Strg + Umschalt + Leertaste drückt, sieht man alle möglichen Signaturen (in diesem Fall zwei).

Puh, wenigstens das funktioniert :)

p.s. wie macht man die schicken Screenshots mit Papiereffekt? HyperSnapz? Gimp?

Cheers,

[edit=mkinzler]Quote an Änderung angepasst Mfg, mkinzler[/edit]

generic 10. Apr 2009 15:17

Re: Problem mit UTF-8 Bytes
 
Die 3 Bytes sind übrigens der BOM - Byte Order Marker.

fkerber 10. Apr 2009 15:22

Re: Problem mit UTF-8 Bytes
 
Hi!

Könntet ihr bitte das Bild als Anhang machen? Dann sind wir nicht von externen, u.U. langsamen Servern abhängig?
Im Quote könnte man dann auch bitte das Bild entfernen, danke.

Im Regelfall sind solche Full-Quotes auch nicht unbedingt sinnvoll...


Ciao, Frederic

mkinzler 10. Apr 2009 15:26

Re: Problem mit UTF-8 Bytes
 
Ich hab das mal erledigt. Aber das nächste mal selber machen!

PeterPanino 10. Apr 2009 17:08

Re: Problem mit UTF-8 Bytes
 
Zitat:

Zitat von fkerber
Könntet ihr bitte das Bild als Anhang machen? Dann sind wir nicht von externen, u.U. langsamen Servern abhängig?

Gute Idee - die meisten Server in den USA werden ja eh bald abgeschaltet, wie man so hört, bzw. werden wegen unbezahlter Stromrechnungen eh bald den Geist aufgeben ... noch mal schnell das Internet auf meiner USB-Festplatte speichern ... so, fertig! ;-)

fkerber 10. Apr 2009 17:12

Re: Problem mit UTF-8 Bytes
 
Hi!

Wie habe ich das zu verstehen?


Ciao, Frederic

PeterPanino 10. Apr 2009 17:16

Re: Problem mit UTF-8 Bytes
 
Zitat:

Zitat von mjustin
wie macht man die schicken Screenshots mit Papiereffekt?

Snagit. Sehr komfortabel, sehr gut automatisierbar. Also ein Tastendruck, und schon steht das mit allen gewünschten Effekten versehene Bildschirmfoto zur Verfügung.

PeterPanino 10. Apr 2009 17:34

Re: Problem mit UTF-8 Bytes
 
Zitat:

Zitat von fkerber
Wie habe ich das zu verstehen?

Kleine Zukunftsvision gemixt mit ein klein bisschen Ironie ...

jaenicke 10. Apr 2009 17:40

Re: Problem mit UTF-8 Bytes
 
Zitat:

Zitat von PeterPanino
Kleine Zukunftsvision gemixt mit ein klein bisschen Ironie ...

Na, dann viel Spaß beim Herunterladen. :mrgreen:
:P
http://www.mywebdownload.com/

PeterPanino 10. Apr 2009 17:47

Re: Problem mit UTF-8 Bytes
 
Zitat:

Zitat von mjustin
Wenn man SL.SaveToFile(); schreibt und die Einfügemarke (Caret) zwischen die Klammern setzt und dann Strg + Umschalt + Leertaste drückt, sieht man alle möglichen Signaturen (in diesem Fall zwei).

Danke für den Tipp! Ich habe bis jetzt immer die automatischen Tooltips verwendet, die angezeigt werden, wenn man den Mauszeiger über dem Token platziert. Aus welchen Quellen werden die beiden Informationen (weiße und gelbe Tooltips) den gespeist? Und sind die Quellen denn anpassbar?

jaenicke 10. Apr 2009 17:50

Re: Problem mit UTF-8 Bytes
 
Eigentlich werden alle in Frage kommenden Möglichkeiten auch angezeigt, wenn man bspw. die Klammer am Anfang schreibt usw., und erst dann ausgeblendet, wenn der Typ zu einer Überladung nicht mehr dazupasst.

Als Quelle nutzt Delphi direkt die Dateien.

PeterPanino 10. Apr 2009 17:53

Re: Problem mit UTF-8 Bytes
 
90% Pornographie und Casinos? Kann das jemand bestätigen? ;-)

jaenicke 10. Apr 2009 18:02

Re: Problem mit UTF-8 Bytes
 
Die Seite war ja ein Aprilscherz, insofern müssen die Angaben ja auch nicht stimmen, darum gehts bei der Seite ja nicht. ;-)

PeterPanino 10. Apr 2009 18:12

Re: Problem mit UTF-8 Bytes
 
Zitat:

Zitat von jaenicke
Die Seite war ja ein Aprilscherz, insofern müssen die Angaben ja auch nicht stimmen, darum gehts bei der Seite ja nicht. ;-)

Trotzdem wäre es interessant zu erfahren, wie hoch der Anteil an "Pornographie und Casinos" tatsächlich ist? Könnte man das dann nicht in ein Delphi-Objekt implementieren und dann so ausführen:

Delphi-Quellcode:
procedure TformMain.btn1Click(Sender: TObject);
begin
  PornographyAndCasinos.Destroy;
end;

jaenicke 10. Apr 2009 18:13

Re: Problem mit UTF-8 Bytes
 
Jetzt uferts hier langsam aus. Das kannst du ja in Klatsch und Tratsch fragen. :mrgreen:

jaenicke 10. Apr 2009 18:29

Re: Problem mit UTF-8 Bytes
 
Damit du das nicht übersiehst antworte ich mal statt zu editieren:
Zitat:

Zitat von PeterPanino
VIELEN DANK! Jetzt funktioniert's!

Wichtig noch: Wenn du die Kennzeichnungsbytes benutzt, dann kann es Probleme mit älteren Browsern oder Editoren geben. Deshalb warnt das W3C noch vor der Verwendung. Die Kennzeichnung des Charsets, auch im Header, genügt ja.

PeterPanino 10. Apr 2009 19:13

Re: Problem mit UTF-8 Bytes
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von jaenicke
Wichtig noch: Wenn du die Kennzeichnungsbytes benutzt, dann kann es Probleme mit älteren Browsern oder Editoren geben. Deshalb warnt das W3C noch vor der Verwendung. Die Kennzeichnung des Charsets, auch im Header, genügt ja.

Wie, das verstehe ich jetzt nicht. Ich soll also SaveToFile ohne den UTF-8 Encoding-Parameter verwenden und lediglich die Kennzeichnung des Charsets im Header der HTML-Datei belassen? Aber wenn ich SaveToFile mit dem UTF-8 Encoding Parameter verwende, werden die 3 Bytes am Anfang der Datei erzeugt: S. angehängtes Bild.

Und wenn ich nur die Kennzeichnung des Charsets im Header der HTML-Datei belasse (ohne den UTF-8 Parameter beim SaveToFile), werden die Umlaute fehlerhaft angezeigt.

mjustin 10. Apr 2009 19:31

Re: Problem mit UTF-8 Bytes
 
Zitat:

Zitat von PeterPanino
Und wenn ich nur die Kennzeichnung des Charsets im Header der HTML-Datei belasse (ohne den UTF-8 Parameter beim SaveToFile), werden die Umlaute fehlerhaft angezeigt.

Die Funktion Utf8Encode ('ab Werk' in Delphi enthalten) könnte in diesem Fall hilfreich sein. Input ist der Unicodestring => Output ist ein UTF8 String, ohne Vorspann.

Cheers,

pitti platsch 10. Apr 2009 19:37

Re: Problem mit UTF-8 Bytes
 
Das Problem ist, dass dir zwei Hochkomma fehlen. Du hast geschrieben:

Zitat:

Zitat von PeterPanino
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />

Nach text/html muss ein " und nach charset= noch eins. Sonst sieht der Browser gar nicht, dass du charset setzen wolltest und wundert sich wahrscheinlich noch was "text/html; charset..." für nen komischer MIME-type ist.

mfg
Peter

jaenicke 10. Apr 2009 19:41

Re: Problem mit UTF-8 Bytes
 
Zitat:

Zitat von pitti platsch
Das Problem ist, dass dir zwei Hochkomma fehlen. Du hast geschrieben:

Zitat:

Zitat von PeterPanino
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />

Nach text/html muss ein " und nach charset= noch eins. Sonst sieht der Browser gar nicht, dass du charset setzen wolltest und wundert sich wahrscheinlich noch was "text/html; charset..." für nen komischer MIME-type ist.

Falsch, die Angabe ist so korrekt!

Zitat:

Zitat von PeterPanino
Und wenn ich nur die Kennzeichnung des Charsets im Header der HTML-Datei belasse (ohne den UTF-8 Parameter beim SaveToFile), werden die Umlaute fehlerhaft angezeigt.

Weil dann vermutlich UTF-16 benutzt wird, schließlich siond Strings bei Delphi 2009 ja jetzt standardmäßig UTF-16 kodiert.

Das mit den Bytes war auch nur ein Hinweis. Das W3C warnt davor, das heißt nicht, dass man die nicht benutzen darf. Nur kann es bei älteren Browsern eben Probleme geben.

Zitat:

Zitat von mjustin
Die Funktion Utf8Encode ('ab Werk' in Delphi enthalten) könnte in diesem Fall hilfreich sein. Input ist der Unicodestring => Output ist ein UTF8 String, ohne Vorspann.

Das hatte ich ja oben schon geschrieben, aber bei Delphi 2009 sollte das mit dem UTF8 Parameter ja korrekt passieren.

PeterPanino 11. Apr 2009 00:08

Re: Problem mit UTF-8 Bytes
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von jaenicke
Diese Bytes sind ja nicht das Entscheidende, sondern die Codierung als UTF-8, und die hast du bisher ja nicht gezeigt. Zudem kann man das glaube ich auch im Header noch einmal setzen, der mit der Datei geschickt wird (per PHP ggf.). Der sollte natürlich auch auf UTF-8 lauten. Wie hast du die denn gemacht? Dies funktioniert jedenfalls problemlos, auch ohne diese Bytes:
Delphi-Quellcode:
var
  test: TStringList;
begin
  test := TStringList.Create;
  test.Text := Utf8Encode('<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">'
    + #13#10'<html xmlns="http://www.w3.org/1999/xhtml">'
    + #13#10'<head>'
    + #13#10'<meta http-equiv="Content-Language" content="de" />'
    + #13#10'<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />'
    + #13#10'<title>Example</title>'
    + #13#10'</head>'
    + #13#10'<body>'
    + #13#10'Das ist ein Text mit ä, ö und ü als Umlaute drin.'
    + #13#10'</body>'
    + #13#10'</html>');
  test.SaveToFile('b:\xyz.html');
  test.Free;
Die Bytes kannst du natürlich zusätzlich auch hinzufügen.

Hallo jaenicke, ich habe das jetzt getestet und es funktioniert NICHT:

Bild entfernt und in Anhang gepackt

Das einzige was funktioniert ist SaveToFile mit dem UTF-Encode Parameter. Und dabei werden die drei genannten Bytes am Anfag der Datei erzeugt.

[edit=SirThornberry]Bild in Anhang gepackt - Mfg, SirThornberry[/edit]

jaenicke 11. Apr 2009 00:14

Re: Problem mit UTF-8 Bytes
 
Richtig, in der ersten Antwort hatte ich auch nicht auf deine Profilangabe mit Delphi 2009 geachtet. Da hat sich das ja etwas geändert. In einer TStringList sind da ja jetzt UnicodeStrings drin.

Für aktuelle Browser ist eine mit den Bytes gespeicherte Datei ja auch sicher kein Problem. Auf welche Browser sich die Warnung des W3C bezieht, steht leider nicht dabei. Im IE gibts jedenfalls auch in älteren Versionen keine Probleme.

Deshalb ist das so schon in Ordnung, solange nicht jemand sehr alte Software zum Öffnen der Dateien verwendet und du damit rechnen musst, dass das so ist.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:35 Uhr.

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