Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Dateinamen mit UTF-8-Zeichen aus Directory lesen (https://www.delphipraxis.net/201257-dateinamen-mit-utf-8-zeichen-aus-directory-lesen.html)

kwhk 5. Jul 2019 10:56

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: ��
https://www.compart.com/de/unicode/U+1F49C

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:
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
Wenn ich den DIR-Befehl folgendermaßen ausführe, kommt ein UTF-8 Ergebnis
(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&#55357;&#56476;C
02.07.2019  08:33    <DIR>         DE&#8364;F
30.08.2018  21:05            72.931 Hase Handy&#55357;&#56476; 5&#8364; Test.jpg
Zitat:

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
Ich habe es mit Csharp ( C# ) probiert

Code:
DirectoryInfo N1dirInfo = new DirectoryInfo(pN1Dir);        // Directory
FileInfo[] N1FileArr = N1dirInfo.GetFiles();                // Datei-Informationen
DirectoryInfo[] N1DirArr = N1dirInfo.GetDirectories("*.*"); // Unterordner-Informationen
Da bekomme ich die korrekten Dateinamen und kann damit diese Dateien auch verarbeiten.

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 ?

Luckie 5. Jul 2019 11:18

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.

Bernhard Geyer 5. Jul 2019 13:19

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.

hoika 5. Jul 2019 14:06

AW: Dateinamen mit UTF-8-Zeichen aus Directory lesen
 
Hallo,
zur Not benutze Utf8Decode

samso 5. Jul 2019 19:33

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.

p80286 5. Jul 2019 22:28

AW: Dateinamen mit UTF-8-Zeichen aus Directory lesen
 
Zitat:

Zitat von kwhk (Beitrag 1436070)
Code:
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

Falls diese unmotivierten Fragezeichen in einer Ausgabe auftauchen (oder auch gefüllte oder leere Rechtecke) dann handelt es sich um Ersatzzeichen des verwendeten Fonts die immer dann ausgegeben werden wenn eine Codierung nicht durch ein zugeordnetes Zeichen repräsentiert werden kann.

Wenn Du also eine zuverlässige Aussage über die verwendeten Zeichen(-Kodierung) treffen willst, geht kein Weg an einem HexDump vorbei.

Gruß
K-H

peterbelow 6. Jul 2019 11:03

AW: Dateinamen mit UTF-8-Zeichen aus Directory lesen
 
Zitat:

Zitat von kwhk (Beitrag 1436070)

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 ?

Versuch mal die Routinen aus der System.IOUtils unit. Die sind auch platformneutral.

kwhk 6. Jul 2019 12:47

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.

samso 6. Jul 2019 19:24

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

KarstenK 6. Jul 2019 20:00

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?

kwhk 6. Jul 2019 20:30

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:
DirList.Items.SaveToFile('DirUTF8.txt',TEncoding.UTF8);
oder

Code:
DirList.Items.SaveToFile('DirUnicode.txt',TEncoding.Unicode);
Wenn man TEncoding nicht angibt, dann werden die besonderen Zeichen als '?' ausgegeben.

Code:
DirList.Items.SaveToFile('DirAnsi.txt');


Nochmals Danke für Deine Arbeit und ein schönes Wochenende !

kwhk 7. Jul 2019 18:59

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.

Bernhard Geyer 8. Jul 2019 06:59

AW: Dateinamen mit UTF-8-Zeichen aus Directory lesen
 
Zitat:

Zitat von kwhk (Beitrag 1436242)
Allerdings hat sich bestätigt, dass in gleicher Weise wie bei C# in einer RichEditBox bzw. TRichEdit diese Zeichen durch Quadrate ersetzt werden.

Quadrate ist eigentlich fast immer ein Font-Problem. Die Listbox wird vermutlich über "Font-Linking" automatisch (von Windows) einen Font nehmen, welche das Zeichen beinhaltet.
Das RTF-Control nicht.

samso 8. Jul 2019 08:19

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:

Zitat von Bernhard Geyer (Beitrag 1436250)
Quadrate ist eigentlich fast immer ein Font-Problem. Die Listbox wird vermutlich über "Font-Linking" automatisch (von Windows) einen Font nehmen, welche das Zeichen beinhaltet.
Das RTF-Control nicht.

Kann man diese Automatik irgendwie prüfen? Bzw. wie kann ich prüfen, ob ein bestimmter Font ein Zeichen enthält oder nicht?

kwhk 8. Jul 2019 09:54

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.

p80286 8. Jul 2019 21:43

AW: Dateinamen mit UTF-8-Zeichen aus Directory lesen
 
Zitat:

Zitat von kwhk (Beitrag 1436271)
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.

Nö!! Je nach Word-Version werden unterschiedliche Standard-Daten in die RTF-Datei geschrieben. Ein simles Hallo Welt kann dann schon mal auf 4K anwachsen.
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

kwhk 9. Jul 2019 10:22

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:
{\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
}
Und so sieht es aus, wenn man in das WordPad-Dokument mit dem hex-Editor das Herz im UTF8-Code einfügt
Code:
{\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&#55357;&#56476; 5\'80 Test\par
}
Leider wird hier durch die Foren-Software auch nicht alles korrekt dargestellt.
Im Edit-Fenster sieht es anders aus (siehe Anhang).

Schokohase 9. Jul 2019 11:48

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:
{\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
}
und sieht dann so aus:
Anhang 51379
Verwendet habe ich im Übrigen dieses Zeichen

Und hier aus der Wikipedia
Zitat:

A standard RTF file can consist of only 7-bit ASCII characters, but can encode characters beyond ASCII by escape sequences.

kwhk 9. Jul 2019 13:14

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 ?

Schokohase 9. Jul 2019 13:25

AW: Dateinamen mit UTF-8-Zeichen aus Directory lesen
 
Zitat:

Zitat von kwhk (Beitrag 1436367)
Wie bekommst Du aber so ein Zeichen in das Dokument, muss man immer über Notepad gehen ?

Nö, kannst du auch mit Delphi machen.

EWeiss 9. Jul 2019 14:20

AW: Dateinamen mit UTF-8-Zeichen aus Directory lesen
 
Zitat:

muss man immer über Notepad gehen ?
Kannst du jede Text Anwendung nehmen wenn du über den entsprechenden Font verfügst.
Zum Beispiel "Words of Love" oder "MTF Doodle Font" oder "DF Eclectics LET" usw..
Enthalten zum Beispiel seine Herzsymbole.

sowas
Code:
{\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
 }
ist dafür nicht von nöten.
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 06:29 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