AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte Vorstellung Unit: File encoding detector
Thema durchsuchen
Ansicht
Themen-Optionen

Vorstellung Unit: File encoding detector

Ein Thema von LTE5 · begonnen am 19. Nov 2017 · letzter Beitrag vom 15. Jan 2018
Antwort Antwort
Seite 3 von 4     123 4      
LTE5
Registriert seit: 13. Nov 2017
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')));

Geändert von LTE5 (24. Nov 2017 um 13:32 Uhr)
 
LTE5

 
Delphi 10.2 Tokyo Starter
 
#21
  Alt 19. Nov 2017, 18:25
Ich habe mir eben mal einen HexEditor besorgt.
Damit verstehe ich das alles vielleicht besser wenn ich dann noch alles mit Haltepunkten durchgehe oder anderweitig mir anzeigen lasse was gerade los ist.

Der Hex-Editor hat ein wenig, aber nicht komplett, Licht ins Dunkle gebracht. Interessant war nur zu sehen, dass mein HexEditor keine UTF-8 mit BOM-Dateien lesen konnte.
Muss vielleicht einen neuen suchen.

Darf ich euch meine neue Version der Unit MIT (!) Codefragmenten von euch zeigen?
Hinzugefügt habe ich Funktionen die Streams entgegennehmen können. Die haben mir intern auch bei so manchem Problem geholfen.

Was Himitus "Billigvariante" mit UTF8ToString angeht: das funktioniert bestimmt wie gewünscht. Da ich aber nur das boolsche Resultat benötige und nichts umwandeln muss, lasse ich die Version raus.

Geändert von LTE5 (19. Nov 2017 um 18:47 Uhr)
  Mit Zitat antworten Zitat
LTE5

 
Delphi 10.2 Tokyo Starter
 
#22
  Alt 19. Nov 2017, 20:37
Alle Änderungen wurden übernommen.
Alle Funktionen nehmen nun auch Streams entgegen.

Es gibt einen kleinen Aufbaufehler, den ich notgedrungen mit der Variablen SkipBOMCheck lösen musste. Sonst würde sich eine Funktion immer wieder selber aufrufen.

Grund dafür, dass GetFileEncoding aber in IsStreamUnicode steckt ist, weil IsStreamUnicode am niedrigsten Punkt ist und von allen übergeordneten Funktionen angesprochen wird.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

 
Delphi 12 Athens
 
#23
  Alt 19. Nov 2017, 20:53
Vom Ansatz her gut aber du prüfst nicht, ob eine Multibyte-Sequenz vorzeitig abgebrochen wird.
Gut erkannt
Ist mir dann auch noch so in den Sinn gekommen. Ich würde das dann aber doch etwas kompakter schreiben:
Delphi-Quellcode:
function IsUTF8(Bytes: TBytes): Boolean;
var
  B: Byte;
  weitere: 0..3;
begin
  weitere := 0;
  for B in Bytes do begin
    if weitere > 0 then begin
      if not (B in [$80..$BF]) then Exit(False);
      Dec(weitere);
    end
    else begin
      case B of
        $00..$7F: ; { ASCII }
        $C2..$DF: weitere := 1;
        $E0..$EF: weitere := 2;
        $F0..$F4: weitere := 3;
      else
        Exit(False);
      end;
    end;
  end;
  Result := True;
end;
Uwe Raabe
  Mit Zitat antworten Zitat
LTE5

 
Delphi 10.2 Tokyo Starter
 
#24
  Alt 20. Nov 2017, 09:35
Zitat:
Es gibt einen kleinen Aufbaufehler, den ich notgedrungen mit der Variablen SkipBOMCheck lösen musste. Sonst würde sich eine Funktion immer wieder selber aufrufen.
Einen zweiten habe ich gerade auch noch gefunden.
Wenn IsStreamUnicode aufgerufen wird, wird als erstes GetFileEncoding aufgerufen. Findet GetFileEncoding kein BOM, wird wieder IsStreamUnicode aufgerufen. IsStreamUnicode läuft also im schlimmsten Fall zweimal durch.

Hat jemand eine Idee wie man diese beiden unschönen Fehler weg bekommt?
  Mit Zitat antworten Zitat
Der schöne Günther
Online

 
Delphi 10 Seattle Enterprise
 
#25
  Alt 20. Nov 2017, 09:54
Ich hoffe dass kommt jetzt nicht als super-harte Kritik wie von Marcel Reich-Ranicki, aber ich fange an hieran zu zweifeln. Ich wollte ein paar Tests schreiben - Es scheitert schon wenn ich einen völlig offensichtlichen Unicode-String wie ╰( ͡° ͜ʖ ͡° )つ──☆*:・゚ reinstecke und bekomme für IsTextUnicode ein False zurück.

Ganz abgesehen davon dass der dort erstellte TStringStream nicht freigegeben wird.
  Mit Zitat antworten Zitat
LTE5

 
Delphi 10.2 Tokyo Starter
 
#26
  Alt 20. Nov 2017, 09:55
Deswegen habe ich im ersten Beitrag im Feedback und Korrekturen gebeten.

Zitat:
Ich hoffe dass kommt jetzt nicht als super-harte Kritik
Doch, eigentlich schon.

Wie gesagt. Ich würde mich sehr freuen wenn ihr mir helft, dass es funktioniert. Mehr als das was im ersten Beitrag steht schaffe ich nicht.
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

 
Delphi 11 Alexandria
 
#27
  Alt 20. Nov 2017, 10:07
Die Funktion IsTextUnicode kann so nicht funktionieren, da die Steuerzeichen nicht vorhanden sind, auch im Stream davon nicht. Des Weiteren ist intern der Delphi-string immer Unicode (Der Standardtyp für Strings ist UnicodeString).

......
Daniel W.
  Mit Zitat antworten Zitat
LTE5

 
Delphi 10.2 Tokyo Starter
 
#28
  Alt 20. Nov 2017, 10:08
Edit

ich habe die Funktion IsTextUnicode jetzt komplett entfernt. Ich brauchte sie eh nicht.
Dafür funktioniert bei mir der Rest wenigstens wie erwartet.

Feedback trotzdem gerne willkommen, denn schön ist die Unit meiner Meinung nach nicht.

Geändert von LTE5 (20. Nov 2017 um 13:00 Uhr)
  Mit Zitat antworten Zitat
LTE5

 
Delphi 10.2 Tokyo Starter
 
#29
  Alt 20. Nov 2017, 20:45
Ich habe gerade eben Version 0.3 in den ersten Beitrag gepackt. Ich habe ein wenig aufgeräumt und umgebaut.
Eigentlich sollte nun einiges funktionieren.

Die BOM-Prüfung wird bisher nur von IsFileUnicode() genutzt.

Nachtrag: sollte etwas nicht funktionieren und das sogar sehr offensichtlich, und ich habe es nicht gesehen, dann bitte ich um ein paar Ohrfeigen.

Geändert von LTE5 (20. Nov 2017 um 20:54 Uhr)
  Mit Zitat antworten Zitat
Wosi
 
#30
  Alt 20. Nov 2017, 21:53
Kleiner Verbesserungsvorschlag: Bei der Methode IsUtf8 sollte der Parameter besser mit const gekennzeichnet werden.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 4     123 4      


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 10:59 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