Delphi-PRAXiS
Seite 1 von 3  1 23      

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?


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:04 Uhr.
Seite 1 von 3  1 23      

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