Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Probleme mit Zeichensatz (https://www.delphipraxis.net/184660-probleme-mit-zeichensatz.html)

Cubysoft 12. Apr 2015 21:33

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:
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;
Ich hoffe ihr könnt mir helfen

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.

himitsu 12. Apr 2015 22:18

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.

Cubysoft 12. Apr 2015 22:41

AW: Probleme mit Zeichensatz
 
Ich habe mein Problem nun gelöst. Ich habe beim Öffnen der Datei einfach das Encoding angegeben:

Delphi-Quellcode:
var
sl: TStringList
begin
 sl := TStringList.Create;
 sl.LoadFromFile('test.dat', TEncoding.UTF8);
end;
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:

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..

himitsu 12. Apr 2015 22:49

AW: Probleme mit Zeichensatz
 
Zitat:

Zitat von Cubysoft (Beitrag 1297379)
Ich frage mich nun nur, ...

Delphi-Referenz durchsuchenTStrings.SaveToFile :roll:

Cubysoft 12. Apr 2015 22:53

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 02:35 Uhr.

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