Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   Vorstellung Unit: File encoding detector (https://www.delphipraxis.net/194428-vorstellung-unit-file-encoding-detector.html)

LTE5 19. Nov 2017 12:23


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:
var IsUnicode: Boolean;
begin
 IsUnicode := TEncodingDetect.IsFileUnicode('pfad-zur-datei.txt');
So ist es auch möglich
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')));

Der schöne Günther 19. Nov 2017 13:26

AW: Vorstellung Unit: File encoding detector
 
Hallo-

Wenn du statt (oder zumindest zusätzlich zu) String-Pfadangaben den Benutzer auch
Delphi-Quellcode:
TStream
reinstecken lässt, lassen sich viel besser Unit-Tests dafür schreiben :thumb:
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:
TUnicodeType
- Mir wäre lieber ich bekäme eine frisch erstellte
Delphi-Quellcode:
TEncoding
-Instanz zurück. Wahrscheinlich Geschmackssache.

PS: Den Typ "NoBOM" zurückzubekommen wenn die angegeben Datei nicht existiert finde ich ehrlich gesagt nicht gut. Da gehört eine Exception geworfen.

LTE5 19. Nov 2017 13:28

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.

Der schöne Günther 19. Nov 2017 13:39

AW: Vorstellung Unit: File encoding detector
 
Meinst du den Vergleich mit den hardkodierten Werten? Ich würde stattdessen
Delphi-Quellcode:
TEncoding.UTF8.GetPreamble()
nehmen?

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...

Luckie 19. Nov 2017 13:39

AW: Vorstellung Unit: File encoding detector
 
Ich habe noch zwei interessante Links dazu:
https://blogs.msdn.microsoft.com/old...7-00/?p=27223/
https://blogs.msdn.microsoft.com/old...24-00/?p=40093

Der schöne Günther 19. Nov 2017 13:40

AW: Vorstellung Unit: File encoding detector
 
https://en.wikipedia.org/wiki/Bush_hid_the_facts

LTE5 19. Nov 2017 13:44

AW: Vorstellung Unit: File encoding detector
 
Zitat:

Zitat von Luckie (Beitrag 1386621)
Ich habe noch zwei interessante Links dazu:
https://blogs.msdn.microsoft.com/old...7-00/?p=27223/

Also im Prinzip habe ich mich Tage lang umsonst bemüht?

Zitat:

Meinst du den Vergleich mit den hardkodierten Werten? Ich würde stattdessen TEncoding.UTF8.GetPreamble() nehmen?
GetPreamble ist gut. Aber TEncoding kennt wie gesagt UTF32 nicht.
Wäre also eine Lösung für alles, bis auf UTF32. Ich füge es oben gleich mal an.

Uwe Raabe 19. Nov 2017 13:53

AW: Vorstellung Unit: File encoding detector
 
Zitat:

Findet sich ein Charakter > 127 (also außerhalb des ASCII-Bereichs), wird unterbrochen denn es ist vermutlich Unicode.
Erfahrungsgemäß ist das gerade im deutschsprachigen Umfeld eher selten der Fall: Ein Zeichen > #127 ist dort in der Regel ein Umlaut.

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.

LTE5 19. Nov 2017 14:03

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:

Findet sich ein Charakter > 127 (also außerhalb des ASCII-Bereichs), wird unterbrochen denn es ist vermutlich Unicode.
Was ich damit meine ist, wenn ein Zeichen > 127 vorkommt, ist es etwas anderes als ANSI.

# 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().

HolgerX 19. Nov 2017 15:47

AW: Vorstellung Unit: File encoding detector
 
Hmm..

Zitat:

Zitat von LTE5 (Beitrag 1386629)
Zitat:

Findet sich ein Charakter > 127 (also außerhalb des ASCII-Bereichs), wird unterbrochen denn es ist vermutlich Unicode.
Was ich damit meine ist, wenn ein Zeichen > 127 vorkommt, ist es etwas anderes als ANSI.

Nicht ganz:

ASCII entspricht 7 Bit = 0-127
ANSI entspricht 8 Bit = 0-255

https://de.wikipedia.org/wiki/ANSI-Zeichencode

Somit kann ein gültiges ANSI-Zeichen auch als Zahl 240 sein.. ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:01 Uhr.
Seite 1 von 4  1 23     Letzte »    

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