![]() |
Vorstellung Unit: File encoding detector
Ich möchte euch gerne meine Arbeit aus den vergangenen Tagen vorstellen.
Ich bin kein Profi und habe mich erst vor wenigen Tagen in Streams eingelesen. Ich brauchte eine Lösung, um mehr oder weniger zuverlässig das Encoding einer Datei herausfinden zu können. Über BOM ist das ja leider nicht immer feststellbar, daher habe ich eine andere Lösung entworfen. Sie ist weder professionell noch gut, aber sie funktioniert. Es ist mehr oder weniger eine Zusammenstellung aus Dingen die ich im Internet gefunden habe. Daher bitte ich um Feedback! Ihr könnt die Unit auch gerne kopieren, anpassen und hier im Beitrag wieder posten. Der Aufruf ist einfach
Delphi-Quellcode:
So ist es auch möglich
var IsUnicode: Boolean;
begin IsUnicode := TEncodingDetect.IsFileUnicode('pfad-zur-datei.txt');
Delphi-Quellcode:
Memo1.Lines.Clear;
Memo1.Lines.Add('File unicode: ' + BoolToStr(TEncodingDetect.IsFileUnicode('pfad-zur-datei.txt'), True)); Memo1.Lines.Add('String unicode: ' + BoolToStr(TEncodingDetect.IsTextUnicode('ʥ'), True)); Memo1.Lines.Add('String unicode: ' + BoolToStr(TEncodingDetect.IsTextUnicode('ABC'), True)); Memo1.Lines.Add('File content: ' + TFile.ReadAllText('pfad-zur-datei.txt', TEncodingDetect.GetEncoding('pfad-zur-datei.txt'))); |
AW: Vorstellung Unit: File encoding detector
Hallo-
Wenn du statt (oder zumindest zusätzlich zu) String-Pfadangaben den Benutzer auch
Delphi-Quellcode:
reinstecken lässt, lassen sich viel besser Unit-Tests dafür schreiben :thumb:
TStream
Es wäre beispielsweise viel einfacher Daten aus einem ZIP-Archiv, einem Email-Anhang oder einem Netzwerk-Stream zu analysieren. So müsste ich ihn erst einmal auf der Platte speichern oder in einen zusätzlichen String speichern. Als Kritik hätte ich sonst noch die Enumeration
Delphi-Quellcode:
- Mir wäre lieber ich bekäme eine frisch erstellte
TUnicodeType
Delphi-Quellcode:
-Instanz zurück. Wahrscheinlich Geschmackssache.
TEncoding
PS: Den Typ "NoBOM" zurückzubekommen wenn die angegeben Datei nicht existiert finde ich ehrlich gesagt nicht gut. Da gehört eine Exception geworfen. |
AW: Vorstellung Unit: File encoding detector
Danke erst einmal.
TEncoding wäre mir auch lieber. Was TEncoding aber nicht kennt sind die UTF32-Varianten von Endian. Oder zählt UTF32 unter TEncoding.Unicode? Was mich auch stört ist, dass ich bei nur einem Aufruf von IsFileUnicode 2x TBytesStream erzeuge, wenn es ganz durch geht. Das könnte man mit einem Konstruktor und Destruktor-Konstrukt lösen. Aber dann wäre es kein Einzeiler mehr. Was mir auch nicht gefällt ist die Art und Weise des Vergleichs auf das BOM. Besser bekomme ich es leider nicht hin. |
AW: Vorstellung Unit: File encoding detector
Meinst du den Vergleich mit den hardkodierten Werten? Ich würde stattdessen
Delphi-Quellcode:
nehmen?
TEncoding.UTF8.GetPreamble()
Ich habe so etwas ähnliches in eine Nummer kleiner auch irgendwo herumliegen, aber nur auf der Arbeit. Da kann ich ab nächster Woche ja mal schauen zum Vergleichen... |
AW: Vorstellung Unit: File encoding detector
Ich habe noch zwei interessante Links dazu:
![]() ![]() |
AW: Vorstellung Unit: File encoding detector
|
AW: Vorstellung Unit: File encoding detector
Zitat:
Zitat:
Wäre also eine Lösung für alles, bis auf UTF32. Ich füge es oben gleich mal an. |
AW: Vorstellung Unit: File encoding detector
Zitat:
Nur so als Hinweis: Die Unit System.Character enthält ein paar Methoden für UTF-32 Zeichen und in System ist auch ein Typ UCS4String definiert, der allerdings nichts mit einem üblichen Delphi-String gemein hat. |
AW: Vorstellung Unit: File encoding detector
Irgendwie habe ich den Eindruck meine Unit ist mehr als nutzlos in diesem Encoding-Labyrinth.
Aber mehr als "erraten" kann man ja eh nicht. Also versuche ich jedenfalls das. Wenn jemand eine bessere Unit bauen kann, würde sich jemand dazu bereit erklären? Zitat:
# Ich habe die Unit in #1 nochmal angepasst. # Ich habe die Unit in #1 noch einmal angepasst. Rückgabewert ist jetzt TEncoding. Ich habe lange getestet. Wenn ich nicht gerade in den Kopfdaten einer Datei rumwühle und komische Werte eintrage, wird die Datei immer korrekt gelesen. # Einen Fall habe ich doch gefunden. Wenn man eine utf-8-Datei ohne BOM prüft und kein Default-Encoding angibt, kommt natürlich ANSI zurück und é kann nicht dargestellt werden. Deswegen gibt es nun eine überladene Version von TEncodingDetect.GetFileEncoding(). |
AW: Vorstellung Unit: File encoding detector
Hmm..
Zitat:
ASCII entspricht 7 Bit = 0-127 ANSI entspricht 8 Bit = 0-255 ![]() Somit kann ein gültiges ANSI-Zeichen auch als Zahl 240 sein.. ;) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:08 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-2025 by Thomas Breitkreuz