![]() |
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. |
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. |
AW: Vorstellung Unit: File encoding detector
Zitat:
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; |
AW: Vorstellung Unit: File encoding detector
Zitat:
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? |
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:
ein
IsTextUnicode
Delphi-Quellcode:
zurück.
False
Ganz abgesehen davon dass der dort erstellte
Delphi-Quellcode:
nicht freigegeben wird.
TStringStream
|
AW: Vorstellung Unit: File encoding detector
Deswegen habe ich im ersten Beitrag im Feedback und Korrekturen gebeten.
Zitat:
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. |
AW: Vorstellung Unit: File encoding detector
Die Funktion
Delphi-Quellcode:
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). ;-)
IsTextUnicode
...:cat:... |
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. |
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. |
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 19:58 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