![]() |
Probleme mit Zeichensatz
Hallo,
zur Erklärung meines Programms: Mein Programm läd von einer Internetseite eine Datei herunter (unbekannter Zeichensatz). Nun läd mein Programm diese Datei in den Arbeitsspeicher. (Problem besteht sowohl beim Laden der Datei über eine Stringlist (Stringlist.LoadFromFile) als auch über AssignFile -> Reset -> Readln) Ich benutze als Speichermedium im Speicher eine Variable vom Typ String (müsste in XE7 also UnicodeString sein). Das Problem ist, dass mein Programm aus "Éibhear Dunn" -> "Éibhear Dunn" macht. Also anscheinend ein Problem mit der Kodierung hat. Ich habe die Datei einfach mal in Notepad++ geöffnet und bekomme dort angezeigt, dass sie UTF8 kodiert ist. Ändere ich die Kodierung in notepad++ auf ANSI wird der genannte Text ebenso falsch dargestellt. Ich selbst habe leider garkeine Ahnung von Kodierungen, bin also relativ überfragt, wie ich nun handeln muss. Ich habe schon versucht mit der Funktion UTF8Encode und anderen Funktionen, die ich so bei meiner Suche entdeckt habe zu arbeiten. Leider immer mit dem selben Ergebnis. Was eventuell noch erwähnenswert wäre: Der Zweck meines Programms ist es im Grunde, einen Text, den der Benutzer in ein Edit einträgt mit dem in der Datei zu vergleichen. Dazu habe ich einen kleinen Test durchgeführt:
Delphi-Quellcode:
Ich hoffe ihr könnt mir helfen
var
s: String; fs: String; begin s := 'Éibhear Dunn'; ShowMessage(s); {funktioniert: Ausgabe: Éibhear Dunn} ShowMessage(ed_test.Text); {funktioniert: Ausgabe: Éibhear Dunn -> manuelle Eingabe im Edit} //gekürzt fs := ReadLn(f,s); ShowMessage(s); {falsche Ausgabe, wie oben beschrieben} end; EDIT: Habe auch noch einige Tests durchgeführt. Ich habe einfach ein Memo die Datei laden lassen, über memo.lines.LoadFromFile. Auch hier zeigt er (wie zu erwarten) das falsche an. Kopiere ich den Text allerdings aus Notepad++ (Strg+C) und füge ihn im normalen Windows Editor ein (Strg+V) und speichere diese Datei, so ist die neue Datei lesbar. Allerdings zeigt mir Notepad beim öffnen auch an, dass die neue Datei nun ANSI kodiert ist. Ich schließe deshalb daraus, dass Delphi nicht mit UTF8 Dateien umgehen kann. |
AW: Probleme mit Zeichensatz
Falsch, man schließt daraus, so wie es übrigens auch in der OH erklärt wird, daß die alten Pascal-Dateifunktionen aus kompatibilitätsgründen standardmäßig die Strings als ANSI schreibt und auch liest.
Ebenso wie die TStringList, wenn sie kein entsprechendes BOM findet. |
AW: Probleme mit Zeichensatz
Ich habe mein Problem nun gelöst. Ich habe beim Öffnen der Datei einfach das Encoding angegeben:
Delphi-Quellcode:
Das funktioniert nun ganz toll eigentlich. Ich würde meiner Frage allerdings gerne etwas ergänzen. Code kann ich nicht posten, weil das Projekt schon sehr umfangreich ist. Das Prinzip ist folgendes:
var
sl: TStringList begin sl := TStringList.Create; sl.LoadFromFile('test.dat', TEncoding.UTF8); end; 1. Programm läd Datei A (UTF8 codiert) herunter 2. Programm öffnet die Datei A (Stringlist) 3. Programm filtert wichtige Informationen und schreibt Zeilenweise (AssignFile, Rewrite, WriteLn, Closefile) in Datei B 4. Programm öffnet Datei B (Stringlist -> TEncoding.UTF8) Dieses Prinzip funktioniert nun bestens. Ich frage mich nun nur, ob Delphi nicht einfach gleich Datei A mit TEncoding.UTF8 laden kann und dann also ANSI encoding abspeichern kann.. |
AW: Probleme mit Zeichensatz
|
AW: Probleme mit Zeichensatz
Das habe ich schon versucht, aber die Stringlist speichert in UTF 8 ohne BOM. Ich mache wohl irgendwas falsch.
Die Sache ist auch, dass ich nicht weiß, welchen Zeichensatz ich für die Daten nutzen soll. Im Prinzip brauche ich einen Zeichensatz, der alle Zeichen der Sprachen Französisch, Deutsch und Englisch erfassen kann. EDIT: Sry funktioniert doch. Habe die Dateien jetzt im ANSI Format. Hat ANSI irgendwelche Nachteile gegenüber UTF8 und könnte damit zu Problemen führen? Also die Frage, die ich jetzt hätte: Ist es besser alles Dateien im UTF8 Format abzuspeichern oder im ANSI. Habe jetzt eigentlich beides hinbekommen, ich weiß nur nicht ob ich mit ANSI nicht Nachteile habe. Im Internet steht oft, dass diesem Zeichensatz einige Zeichen fehlen.. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:21 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