AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Delphi UTF-8 Datei einlesen, umwandeln in ANSI...statt Umlaute sind Fragezeichen vorhanden
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von juergen · begonnen am 5. Mär 2014 · letzter Beitrag vom 5. Mär 2014
Antwort Antwort
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
1.164 Beiträge
 
Delphi 11 Alexandria
 
#1

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

  Alt 5. Mär 2014, 10:52
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!
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)
  Mit Zitat antworten Zitat
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
1.164 Beiträge
 
Delphi 11 Alexandria
 
#2

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

  Alt 5. Mär 2014, 10:57
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.
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

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

  Alt 5. Mär 2014, 11:02
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;
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.733 Beiträge
 
Delphi 6 Enterprise
 
#4

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

  Alt 5. Mär 2014, 11:18
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.
Ralph

Geändert von Jumpy ( 5. Mär 2014 um 11:21 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
1.164 Beiträge
 
Delphi 11 Alexandria
 
#5

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

  Alt 5. Mär 2014, 11:37
@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!
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)
  Mit Zitat antworten Zitat
nuclearping

Registriert seit: 7. Jun 2008
708 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

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

  Alt 5. Mär 2014, 11:58
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.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#7

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

  Alt 5. Mär 2014, 12:10
Unter Delphi XE wird die Ansi-Codierung mit TEncoding.Default festgelegt.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.155 Beiträge
 
Delphi 12 Athens
 
#8

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

  Alt 5. Mär 2014, 12:21
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)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 5. Mär 2014 um 12:24 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
1.164 Beiträge
 
Delphi 11 Alexandria
 
#9

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

  Alt 5. Mär 2014, 14:20
Hallo,
danke für die Erklärungen!
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
Jürgen
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.155 Beiträge
 
Delphi 12 Athens
 
#10

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

  Alt 5. Mär 2014, 14:54
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)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:45 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