Ich habe eine Anwendung (eine psychologische Test-Prüfung) in Delphi (7) geschrieben, die eine Standard-Textdatei erstellt - dh die Datei ist vom Typ ANSI.
Jemand hat das Programm portiert, um im Internet zu laufen, wahrscheinlich mit Java, und die resultierende Textdatei hat den Typ UTF-8.
Das Programm, das diese Ergebnisdateien liest, muss sowohl die von Delphi erstellten Dateien als auch die über das Internet erstellten Dateien lesen.
Während ich den UTF-8-Text nach ANSI konvertieren kann (mit der schlau benannten Funktion UTF8ToANSI), wie kann ich im Voraus feststellen, welche Art von Datei ich habe?
Da ich das Dateiformat "besitze", denke ich, dass der einfachste Weg, dies zu tun, darin besteht, an einer bekannten Stelle eine Markierung in der Datei anzubringen, die mir die Quelle des Programms (Delphi / Internet) verrät, aber das scheint zu betrügen.
Vielen Dank im Voraus.
Wenn die UTF-Datei mit der Byte-Order-Markierung (BOM) von UTF-8 beginnt, ist dies einfach:
%Vor%Ansonsten ist es viel schwieriger.
Es gibt keine 100% sichere Möglichkeit, die ANSI-Codierung (z. B. Windows-1250) aus der UTF-8-Codierung zu erkennen. There sind ANSI-Dateien, die nicht gültige UTF-8 sein können, aber jede gültige UTF-8-Datei könnte auch eine andere ANSI-Datei sein. (Ganz zu schweigen von ASCII-Daten, die definitionsgemäß beide ANSI und UTF-8 sind, aber das ist nur ein theoretischer Aspekt.)
Zum Beispiel könnte die Sequenz C4 8D das Zeichen "è" in UTF-8 sein, oder es könnte "Ť" in Windows-1250 sein. Beides ist möglich und richtig. B. 8D 9A kann "Ťš" in Windows-1250 sein, aber es ist keine gültige UTF-8-Zeichenfolge.
Sie müssen auf eine Art Heuristik zurückgreifen, z. B.
Siehe auch die von Notepad verwendete Methode .
Wenn wir summieren , dann:
SONSTIGE INFO-MENSCHEN KÖNNEN INTERESSANT SEIN:
%Vor%Jetzt testen Sie diese Funktion ...
Meiner bescheidenen Meinung nach ist es nur möglich, OS charset an erster Stelle zu checken, um diese Prüfung richtig zu machen, denn am Ende werden fast immer Referenzen auf OS gemacht. Keine Möglichkeit, es trotzdem zu scannen ...
Anmerkungen:
Versuchen Sie beim ersten Lesen die Datei als UTF-8 zu analysieren. Wenn es nicht gültig ist, interpretiert UTF-8 die Datei als Legacy-Encoding (ANSI). Dies funktioniert bei den meisten Dateien, da es sehr unwahrscheinlich ist, dass eine ältere kodierte Datei UTF-8 ist.
Welche Windows-Aufrufe ANSI sind, hängt vom System-Gebietsschema ab. Und der Text wird nicht korrekt auf einem russischen oder asiatischen oder ... Windows funktionieren.
Obwohl die VCL Unicode in Delphi 7 nicht unterstützt, sollten Sie intern immer noch mit Unicode arbeiten und nur ANSI für die Anzeige konvertieren. Ich lokalisierte eines meiner Programme auf Koreanisch und Russisch, und das war der einzige Weg, wie ich es ohne große Probleme funktionierte. Sie konnten die koreanische Lokalisierung nur auf einem System anzeigen, das auf Koreanisch eingestellt war, aber zumindest konnten die Textdateien auf jedem System bearbeitet werden.