Delphi-PRAXiS
Seite 3 von 4     123 4      

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 18:25

AW: Vorstellung Unit: File encoding detector
 
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.

LTE5 19. Nov 2017 20:37

AW: Vorstellung Unit: File encoding detector
 
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.

Uwe Raabe 19. Nov 2017 20:53

AW: Vorstellung Unit: File encoding detector
 
Zitat:

Zitat von Wosi (Beitrag 1386654)
Vom Ansatz her gut aber du prüfst nicht, ob eine Multibyte-Sequenz vorzeitig abgebrochen wird.

Gut erkannt :thumb:
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;

LTE5 20. Nov 2017 09:35

AW: Vorstellung Unit: File encoding detector
 
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?

Der schöne Günther 20. Nov 2017 09:54

AW: Vorstellung Unit: File encoding detector
 
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
Delphi-Quellcode:
╰( ͡° ͜ʖ ͡° )つ──☆*:・゚
reinstecke und bekomme für
Delphi-Quellcode:
IsTextUnicode
ein
Delphi-Quellcode:
False
zurück.

Ganz abgesehen davon dass der dort erstellte
Delphi-Quellcode:
TStringStream
nicht freigegeben wird.

LTE5 20. Nov 2017 09:55

AW: Vorstellung Unit: File encoding detector
 
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.

sakura 20. Nov 2017 10:07

AW: Vorstellung Unit: File encoding detector
 
Die Funktion
Delphi-Quellcode:
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). ;-)

...:cat:...

LTE5 20. Nov 2017 10:08

AW: Vorstellung Unit: File encoding detector
 
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.

LTE5 20. Nov 2017 20:45

AW: Vorstellung Unit: File encoding detector
 
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.

Wosi 20. Nov 2017 21:53

AW: Vorstellung Unit: File encoding detector
 
Kleiner Verbesserungsvorschlag: Bei der Methode IsUtf8 sollte der Parameter besser mit const gekennzeichnet werden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:14 Uhr.
Seite 3 von 4     123 4      

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