![]() |
Dateinamen mit UTF-8-Zeichen aus Directory lesen
Durch Zufall bin ich darauf gestoßen, dass Dateinamen u.U. auch solche Zeichen enthalten können:
![]() Ich hab ein Compare-Programm, mit dem ich die Directorys auslese und die Dateien mit einem anderen Directory vergleiche. Die Dateien vom Smartphone, wo junge Leute gern solche Zeichen in ihren Namen aufnehmen und wo diese dann in Dateinamen stehen, lassen sich mit meinem Programm nicht vergleichen, weil aus dem Record von FindFirst / FindNext mittels Record.name nicht die UTF-8-Zeichen, sondern stattdessen Fragezeichen übergeben werden. Der "normale" DIR Befehl liefert folgende Anzeige (analog FindFirst/FindNext)
Code:
Wenn ich den DIR-Befehl folgendermaßen ausführe, kommt ein UTF-8 Ergebnis
02.07.2019 08:32 <DIR> AB??C
02.07.2019 08:33 <DIR> DE?F 30.08.2018 21:05 72.931 Hase Handy?? 5? Test.jpg (Leider werden diese Zeichen bei [ Code ] hier im Forum nicht angezeigt, bei [ Quote ] schon
Code:
chcp 65001
DIR *.* >#dir65001.dir 02.07.2019 08:32 <DIR> AB��C 02.07.2019 08:33 <DIR> DE€F 30.08.2018 21:05 72.931 Hase Handy�� 5€ Test.jpg Zitat:
Code:
Da bekomme ich die korrekten Dateinamen und kann damit diese Dateien auch verarbeiten.
DirectoryInfo N1dirInfo = new DirectoryInfo(pN1Dir); // Directory
FileInfo[] N1FileArr = N1dirInfo.GetFiles(); // Datei-Informationen DirectoryInfo[] N1DirArr = N1dirInfo.GetDirectories("*.*"); // Unterordner-Informationen Gibt es in Delphi auch eine etwas modernere Funktion, mit der man Directorys lesen kann, also Dateinamen und auch Directory-Namen mit UTF-8 Zeichen ? |
AW: Dateinamen mit UTF-8-Zeichen aus Directory lesen
In den neueren Delphis gibt es doch die Datei- bzw. Verzeichnisklasse. Hast du es damit schon mal probiert? Delphi bietet ja Jetzt auch eine vollständig Unicodeunterstützung.
|
AW: Dateinamen mit UTF-8-Zeichen aus Directory lesen
Hast du wirklich Delphi 10.3 im Einsatz oder doch nicht ein altes Delphi?
Ab D2009 sollte es kein Problem mehr damit geben, außer du verwendest eigenen Implementierung um das auszulesen, welche noch fest auf die ANSI-Version der API gebungenden sind. Ebenfalls ist die Verwendung von AnsiString "ungünstig", da diese natürlich Unicodestrings kaputt macht. |
AW: Dateinamen mit UTF-8-Zeichen aus Directory lesen
Hallo,
zur Not benutze Utf8Decode |
AW: Dateinamen mit UTF-8-Zeichen aus Directory lesen
Windows spricht entweder Ansi oder UTF-16 aber niemals UTF-8. Dein Code 55357;56476; entspricht 0xD83D 0xDC9C das ist Dein "Purple Heart" UTF-16 codiert.
|
AW: Dateinamen mit UTF-8-Zeichen aus Directory lesen
Zitat:
Wenn Du also eine zuverlässige Aussage über die verwendeten Zeichen(-Kodierung) treffen willst, geht kein Weg an einem HexDump vorbei. Gruß K-H |
AW: Dateinamen mit UTF-8-Zeichen aus Directory lesen
Zitat:
|
AW: Dateinamen mit UTF-8-Zeichen aus Directory lesen
Liste der Anhänge anzeigen (Anzahl: 2)
Hier die DIR-Listings als ASC und UTF8, auch HEX. Und die Version meines Delphi10.3.
|
AW: Dateinamen mit UTF-8-Zeichen aus Directory lesen
Liste der Anhänge anzeigen (Anzahl: 2)
Also bei mir spielt das ganz wunderbar seit Delphi 2009 (unter Benutzung Sysutils.Findfirst/Findnext). Anbei Demoprogramm mit Delphi 10.1. Da der String in SearchRec.Name UTF-16 codiert ist, hat jeder Char 16 Bit. Das erste Herz wird dann mit zwei Chars mit den Hexwerten $D83D, $DC9C codiert (so wie in Deinem Beispiel). Wenn man möchte kann man den String auch zu UTF-8 umkodieren. Dazu genügt die Umwandlung UTF8String(SearchRec.Name).
|
AW: Dateinamen mit UTF-8-Zeichen aus Directory lesen
Im Hex dump utf8 stehen sie doch richtig drin.
Bist Du sicher das dein Verwendeter Font diese Zeichen auch unterstützt? |
AW: Dateinamen mit UTF-8-Zeichen aus Directory lesen
Hallo samso,
Dein Demo-Projekt funktioniert einwandfrei. Ich kann die Dateien auch öffnen bzw. mit FileExists überprüfen, auch die mit den lustigen Zeichen im Namen. Ich muss mein Programm auf String-Einstellungen überprüfen. Es kann ja nur daran liegen. Mit folgendem Befehl kann man die gefundenen Namen in eine Datei ausgeben
Code:
oder
DirList.Items.SaveToFile('DirUTF8.txt',TEncoding.UTF8);
Code:
Wenn man TEncoding nicht angibt, dann werden die besonderen Zeichen als '?' ausgegeben.
DirList.Items.SaveToFile('DirUnicode.txt',TEncoding.Unicode);
Code:
DirList.Items.SaveToFile('DirAnsi.txt');
Nochmals Danke für Deine Arbeit und ein schönes Wochenende ! |
AW: Dateinamen mit UTF-8-Zeichen aus Directory lesen
Nun habe ich das Programm umgestellt, vor allem alle ShortString, String[nn], AnsiString usw. auf String umgestellt. Da klappt es mit den UTF8-Zeichen.
Allerdings hat sich bestätigt, dass in gleicher Weise wie bei C# in einer RichEditBox bzw. TRichEdit diese Zeichen durch Quadrate ersetzt werden. Ich habe die TRichEdit durch eine TListBox ersetzt, in dieser werden die UTF8-Zeichen korrekt dargestellt. In diese Box werden die Log-Informationen ausgegeben, also auch Pfad- und Dateinamen. Samso hat in seinem Demo-PGM auch eine TListBox benutzt. |
AW: Dateinamen mit UTF-8-Zeichen aus Directory lesen
Zitat:
Das RTF-Control nicht. |
AW: Dateinamen mit UTF-8-Zeichen aus Directory lesen
Ich habe das ebenfalls getestet. Die TRichEdit-Komponente scheint tatsächlich ein Problem mit den Surrogaten zu haben(trotz gleichen Fonts). Eine andere (kostenpflichtige) TRichEdit-Komponente hat dieses Problem nicht.
Zitat:
|
AW: Dateinamen mit UTF-8-Zeichen aus Directory lesen
Windows liefert als Zubehör das Programm WordPad, damit kann man beinahe so, wie mit Office-Word Textdateien bearbeiten.
Die bestmögliche Speichern-Form ist Speichern als RTF-Datei. Wenn ich versuche in WordPad so ein Herz-Zeichen einzufügen, da wird das ignoriert. Ich habe mit einem Hex-Editor den Hex-Code F0 9F 92 9C hinein editiert, da wird von WordPad nur Unsinn angezeigt. Wenn ich die RTF-Datei mit Office-Word bearbeite, kann ich das Herz-Symbol einfügen. Die Datei vergrößert sich von 219 Bytes auf 1910 Bytes. Office-Word fügt vermutlich Grafiken ein, keine Zeichen. Fazit: RichText kann / unterstützt das nicht. |
AW: Dateinamen mit UTF-8-Zeichen aus Directory lesen
Zitat:
Aber mit Notepad (z.B.)kann man sich den Inhalt einer RTF-Datei anschauen. Da sieht man dann wirklich was man hat. Gruß K-H |
AW: Dateinamen mit UTF-8-Zeichen aus Directory lesen
Liste der Anhänge anzeigen (Anzahl: 1)
So sieht es aus, wenn man mit Word ein Herz einfügt (m.E. ist das Grafik)
Code:
Und so sieht es aus, wenn man in das WordPad-Dokument mit dem hex-Editor das Herz im UTF8-Code einfügt
{\rtf1\ansi\ansicpg1252\deff0\nouicompat\deflang1031\deflangfe1031{\fonttbl{\f0\fswiss\fprq2\fcharset0 Calibri;}{\f1\fnil\fcharset1 Segoe UI Symbol;}}
{\*\generator Riched20 10.0.18362}{\*\mmathPr\mnaryLim0\mdispDef1\mwrapIndent1440 }\viewkind4\uc1 \pard\nowidctlpar\sa200\sl276\slmult1\f0\fs22\lang7 Hase Handy \f1\lang1031\u-10179?\u-9060?{\pict{\*\picprop{\sp{\sn wzDescription}{\sv Image}}{\sp{\sn posv}{\sv 1}} }\pngblip\picw847\pich847\picwgoal480\pichgoal480 89504e470d0a1a0a0000000d494844520000002000000020080300000044a48ac6000000017352 474200aece1ce90000000467414d410000b18f0bfc6105000000cc504c5445000000a85aeead47 eba95aee984adcaa5bf0ab5af09143d4aa5cefab5cf0a95bee994adc9245d5aa5befaa5bef9547 d89648d9984bdcab5bf0aa5bef984adcab5bf0994bdda95bee9a4cddaa5af09c4edf9a4adf9b4a d7a155ec9d4ee1a354e6aa5befaa5bef9546d6aa5befaa5aed9e4fe09649da964adaaa5aefaa5c ef984cdc974cdbab5cf0a95aef9b4edeaa5bef8d40cfc28fef8f41d1b676efa657eba153e6ac5f efaf66efa555e99143d3b572ef994adc9547d88f42d2ba7defad62efbf89efbc82efba7eefb26c ef169165d30000002f74524e53004606feb55120faf9c63bfef4eedddcd3a5977e7e7676696763 483a130dfef6f3e9e6d5cfc5c0bbaf9b8a87857117324e7891000000097048597300000ec30000 0ec301c76fa8640000012f49444154384fbd92d97282401045071114dc8dc66834fbbe4d3380e0 6e92ffffa7f4c02d2388af9ea7e97b6ed1038538191363d8b76c0cc2b6fa43e30b83c6eedec8cd 544ac7d093eb441b29e575fb32918cd1887e3ccfe7d02c0bf131f7beb92c65a8cee1abbe977a29 e3ce60eead93a3940b4a1aa5a6f6738457e63aad320155265cf89cb2ff45966549bc523891b78d 90e4a8519d0b8da99fdca98005292e543115b024e24213530133aa70e105d32121d11d172c8c87 f086772e94ee31e7e107544a5c102e821ce68ce8427b21ce106559103da75e885764fbf0821634 5fa38bf41ff6ede40220bf2556f4040506265442b0a20ec40e6bef9307337a43bc877b0bcd7e85 f7cb623fa43e5ed5777f6396f163a0bd6a8d111c52ae05a1d27fd1517a4af5703cc26884c3c910 e20f81fe5dec20cb86d90000000049454e44ae426082 }\f0\lang7 5\'80 Test\par }
Code:
Leider wird hier durch die Foren-Software auch nicht alles korrekt dargestellt.
{\rtf1\ansi\ansicpg1252\deff0\nouicompat\deflang1031{\fonttbl{\f0\fnil\fcharset0 Calibri;}}
{\*\generator Riched20 10.0.18362}\viewkind4\uc1 \pard\sa200\sl276\slmult1\f0\fs22\lang7 Hase Handy�� 5\'80 Test\par } Im Edit-Fenster sieht es anders aus (siehe Anhang). |
AW: Dateinamen mit UTF-8-Zeichen aus Directory lesen
Liste der Anhänge anzeigen (Anzahl: 1)
Also ich meine in diesem RTF-Code dürfen nur ASCII-Zeichen auftauchen. Alles andere, was über HEX 7F liegt muss entsprechend kodiert werden.
Und dann kommt dabei so etwas heraus
Code:
und sieht dann so aus:
{\rtf1\ansi\ansicpg1252\deff0\nouicompat\deflang1031{\fonttbl{\f0\fnil\fcharset0 Calibri;}}
{\*\generator Riched20 10.0.18362}\viewkind4\uc1 \pard\sa200\sl276\slmult1\f0\fs22\lang7 Hello World!\u10084?\par } Anhang 51379 Verwendet habe ich im Übrigen ![]() Und hier aus der ![]() Zitat:
|
AW: Dateinamen mit UTF-8-Zeichen aus Directory lesen
Das ist toll, wird auch von WordPad angezeigt.
Wie bekommst Du aber so ein Zeichen in das Dokument, muss man immer über Notepad gehen ? |
AW: Dateinamen mit UTF-8-Zeichen aus Directory lesen
Zitat:
|
AW: Dateinamen mit UTF-8-Zeichen aus Directory lesen
Zitat:
Zum Beispiel "Words of Love" oder "MTF Doodle Font" oder "DF Eclectics LET" usw.. Enthalten zum Beispiel seine Herzsymbole. sowas
Code:
ist dafür nicht von nöten.
{\rtf1\ansi\ansicpg1252\deff0\nouicompat\deflang1031{\fonttbl{\f0\fnil\fcharset0 Calibri;}}
{\*\generator Riched20 10.0.18362}\viewkind4\uc1 \pard\sa200\sl276\slmult1\f0\fs22\lang7 Hello World!\u10084?\par } Ich erstelle so zum Beispiel Check Marks für meine Button.. Dieser könnte mit entsprechenden Font und Char auch ein Herz oder was anderes sein. gruss |
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 by Thomas Breitkreuz