Erkennung des Dateityps "Text" (ANSI vs UTF-8)

7

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.

    
No'am Newman 05.02.2011, 16:11
quelle

4 Antworten

1

Wenn die UTF-Datei mit der Byte-Order-Markierung (BOM) von UTF-8 beginnt, ist dies einfach:

%Vor%

Ansonsten ist es viel schwieriger.

    
Andreas Rejbrand 05.02.2011, 16:15
quelle
17

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.

  1. Wenn die Datei eine Sequenz enthält, die kein gültiges UTF-8 sein kann, nehmen Sie an, dass es ANSI ist.
  2. Andernfalls, wenn die Datei mit UTF-8 BOM (EF BB BF) beginnt, wird angenommen, dass es sich um UTF-8 handelt (dies ist jedoch nicht der Fall. ANSI-Dateien im Klartext, die mit solchen Zeichen beginnen, sind sehr unwahrscheinlich).
  3. Andernfalls wird angenommen, dass es sich um UTF-8 handelt. (Oder, versuchen Sie mehr Heuristiken, vielleicht mit dem Wissen der Sprache des Textes, etc.)

Siehe auch die von Notepad verwendete Methode .

    
Mormegil 05.02.2011 16:28
quelle
1

Wenn wir summieren , dann:

  • Die beste Lösung für basic ist es veraltet zu verwenden (wenn wir IsTextUnicode () ;);
  • Beste Lösung für erweiterte Verwendung ist die Verwendung der Funktion oben, dann Stückliste (~ 1KB), dann überprüfen Locale Informationen unter bestimmten OS und erst dann über 98% Genauigkeit?

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:

HX_unbanned 25.02.2011 09:34
quelle
0

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.

    
CodesInChaos 05.02.2011 16:56
quelle

Tags und Links