Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi UTF-8 Datei einlesen, umwandeln in ANSI...statt Umlaute sind Fragezeichen vorhanden (https://www.delphipraxis.net/179400-utf-8-datei-einlesen-umwandeln-ansi-statt-umlaute-sind-fragezeichen-vorhanden.html)

juergen 5. Mär 2014 11:52

UTF-8 Datei einlesen, umwandeln in ANSI...statt Umlaute sind Fragezeichen vorhanden
 
Hallo zusammen,

ich lese unter Delphi XE eine UTF-8 Datei ein (wird in Notepad als UTF-8 Datei erkannt).
Diese Datei muss ich als ANSI-Datei neu abspeichern. Dabei sollen die Umlaute erhalten bleiben.

Folgenden Code nutze ich:
Delphi-Quellcode:
        slFile.LoadFromFile(dlgOpen1.Filename);
        for i := 0 to slFile.Count - 1 do begin
          slFile.Strings[i] := Utf8ToAnsi(slFile.Strings[i]);
        end;
        slFile.SaveToFile(dlgOpen1.Filename);
Wenn ich die neu erstellte Datei mit Notepad öffne, sehe ich, dass es eine ANSI Datei ist.
Aber anstelle der Umlaute stehen Fragezeichen in der Datei.

Weiß hierzu jemand Rat?

Vielen Dank schon mal vorab!

juergen 5. Mär 2014 11:57

AW: UTF-8 Datei einlesen, umwandeln in ANSI...statt Umlaute sind Fragezeichen vorhand
 
SORRY, Problem erkannt!
Mein Problem ist, wenn ich die Datei ein 2. Mal mit Utf8ToAnsi() umwandle, dann sind keine Umlaute mehr vorhanden!

Wie kann man sowas umgehen, ich müsste erst prüfen ob es überhaupt eine UTF-8 Datei ist.

Der schöne Günther 5. Mär 2014 12:02

AW: UTF-8 Datei einlesen, umwandeln in ANSI...statt Umlaute sind Fragezeichen vorhand
 
Du kannst doch einfach bei SaveToFile angeben, mit welchem Encoding er speichern soll?

Delphi-Quellcode:
procedure TForm22.Button1Click(Sender: TObject);
var
   sl: TStrings;
   line: String;
begin

   sl := TStringList.Create();
   sl.LoadFromFile('C:\Users\[...]\test.txt');

   sl.SaveToFile(
      'C:\Users\[...]\test_ansi.txt',
      TEncoding.ANSI
   );


end;

Jumpy 5. Mär 2014 12:18

AW: UTF-8 Datei einlesen, umwandeln in ANSI...statt Umlaute sind Fragezeichen vorhand
 
Zitat:

Wo / Ab wann gibt es denn diese Funktion "Utf8ToAnsi" die in #1 benutzt wird?

Ich brauch sowas (und die Umkehrfunktion) für D6 und hab da nix gefunden und mir daher selber was reichlich unelegantes für die gängigsten Zeichen (z.B. Umlaute ) gebastelt.
Ziehe die Frage zurück. Jetzt wo ich weiß, wie es heißt, hab ich was gefunden.

juergen 5. Mär 2014 12:37

AW: UTF-8 Datei einlesen, umwandeln in ANSI...statt Umlaute sind Fragezeichen vorhand
 
@Der schöne Günther.
Danke für den Hinweis. Das war auch mein erster Ansatz, da das so in der Classes-Unit steht. Allerdings kennt mein Delphi nur TEncoding.ASCII.
Notepad erkennt diese Datei dann als ANSI Datei, aber die Umlaute wurden falsch encodiert.

Im Prinzip habe ich nun eine Lösung mit Utf8ToAnsi() die funktioniert.
Ich schreibe mir beim ersten öffnen der UTF-8 Datei ein Flag in die Datei, so dass ich beim nächsten Öffnen der Datei weiß, dass diese von mir schon mal umgewandelt worden ist.

Vielen Dank und noch einen schönen Tag!:dp:

nuclearping 5. Mär 2014 12:58

AW: UTF-8 Datei einlesen, umwandeln in ANSI...statt Umlaute sind Fragezeichen vorhand
 
UTF-8 Dateien haben - wenn sie korrekt gespeichert wurden - doch schon ein "Flag", das sogenannte "Byte Order Mark".

http://de.wikipedia.org/wiki/Byte_Order_Mark

Also das heisst, dass du beim ersten Öffnen schon daran erkennen könntest, ob es sich um eine UTF8-Datei handelt.

DeddyH 5. Mär 2014 13:10

AW: UTF-8 Datei einlesen, umwandeln in ANSI...statt Umlaute sind Fragezeichen vorhand
 
Unter Delphi XE wird die Ansi-Codierung mit TEncoding.Default festgelegt.

himitsu 5. Mär 2014 13:21

AW: UTF-8 Datei einlesen, umwandeln in ANSI...statt Umlaute sind Fragezeichen vorhand
 
Delphi-Quellcode:
// läd die Datei mit dem Encoding, welches erkannt wird (über ein eventuell vorhandenes BOM)
// und wandelt dann alles in Unicode um (String/UnicodeString) und das wird eventuell auch noch falsch codiert, falls es UTF-8 ohne BOM war
slFile.LoadFromFile(dlgOpen1.Filename);
for i := 0 to slFile.Count - 1 do begin
  // Strings[i] gibt eine String/UnicodeString zurück
  // Utf8ToAnsi will aber einen UTF8String = automatische Umwandlung, welches auch schief gehen kann und es wird plötzlich zum ANSI
  // - welche aber der Compiler bemängeln sollte, für die, welche das CompilerLog lesen
  // Utf8ToAnsi macht dann aus dem ANSI/UTF8 ein ANSI
  // Strings[i] will wieder seinen String/UnicodeString, also wird aus dem ANSI wider Unicode
  // - welche aber der Compiler bemängeln sollte, für die, welche das CompilerLog lesen
  slFile.Strings[i] := Utf8ToAnsi(slFile.Strings[i]);
end;
// speichert es dann als ANSI, also wieder Unicode zu ANSI, da kein Encoding angegeben wurde.
slFile.SaveToFile(dlgOpen1.Filename);
Delphi-Quellcode:
slFile.LoadFromFile(dlgOpen1.Filename, TEncoding.UTF8); // wenn BOM in der Datei vorhanden, dann ist das nicht nötig
slFile.SaveToFile(dlgOpen1.Filename, TEncoding.Default); // Default ist Standard und könnte weggelassen werden (entspricht auch dem TEncoding.ANSI)

juergen 5. Mär 2014 15:20

AW: UTF-8 Datei einlesen, umwandeln in ANSI...statt Umlaute sind Fragezeichen vorhand
 
Hallo,
danke für die Erklärungen! :thumb:
Es scheint dann mit meiner UTF-8 Datei etwas nicht zu stimmen. Diese bekomme ich von einem Unix-Server.
Wenn ich es so mache wie himitsu es in den letzten beiden Codezeilen dargestellt hat, dann läuft das beim ersten Mal durch, aber das Ergebnis sind anstelle von Umlauten dann wieder Fragezeichen.
Beim 2. Ausführen bekomme ich eine Schutzverletzung bei TEncoding.UTF8. Da die Datei vorher als ANSI gespeichert wurde ist das auch klar.

Somit bleibe ich bei meiner Methode wo ich Utf8ToAnsi() anwende, das funktioniert.
Da ich nicht ausschließen kann dass die Datei mehrmals eingelesen wird, muss ich mir in der Datei ein Merker setzen dass diese schon encodiert wurde. Eine andere Möglichkeit sehe ich momentan nicht.

Gruß
Jürgen

himitsu 5. Mär 2014 15:54

AW: UTF-8 Datei einlesen, umwandeln in ANSI...statt Umlaute sind Fragezeichen vorhand
 
Es könnte natürlich sein, daß die Datei nicht als UTF-8 gespeichert wurde,

oder das UTF-8 könnte auch bei einer Dateiübertragung "zerstört" wurden sein. (z.B. Übertragung via ASCII)


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:38 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 by Thomas Breitkreuz