Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Mit Unicode-Dateinamen arbeiten (https://www.delphipraxis.net/168412-mit-unicode-dateinamen-arbeiten.html)

blablab 19. Mai 2012 15:21

Mit Unicode-Dateinamen arbeiten
 
Hallo!

Gibt es eine Möglichkeit bei Dateinamen volle Unicode-Unterstützung zu bieten? Ich benutze FindFirstFile und FindNextFile. Da gibt es ja FindNextFileW, wo er mit WideStrings arbeitet. Aber WideString unterstützt ja auch nicht alle Unicode-Zeichen. Gibt es auch eine Möglichkeit MultiByteStrings auszulesen? Oder kann ich höchstens WideStrings auslesen und die dann in MultiByteStrings umwandeln? Denn damit hätte ich ja keine vollständige Unicode-Unterstützung...

Und zu den MultiByteStrings hätte ich noch eine Frage:
Mir ist aufgefallen, dass (zumindest an einer Stelle im Delphicode) MultiByte-Zeichensätze nur berücksichtigt werden wenn SysLocale.FarEast = True gilt. Das find ich irgendwie komisch, denn auch wenn mein Gebietsschema auf "deutsch" eingestellt ist, kann ich doch mal auf eine Datei mit Unicode-Zeichensatz stoßen.
Im Normalfall wird mir also wahrscheinlich kein Unicode-Zeichen begegnen, aber ich möchte trotzdem Unicode unterstützen. Muss ich dann beim ProgrammStart SysLocale.FarEast auf True setzen, oder wie ist das gedacht?

(Ich benutze übrigens Delphi7...)

Grüße
blablab

jaenicke 19. Mai 2012 15:39

AW: Mit Unicode-Dateinamen arbeiten
 
Bei den Unicode-Funktionen wird mit PWideChar gearbeitet. Da Windows damit auch intern arbeitet, wirst du wohl kaum Zeichen in ein Dateisystem hineinbekommen, die du unter Windows nutzen kannst und damit nicht nutzbar sind. ;-)

Bei Delphi 7 hast du nun einmal noch keine echte Unicodeunterstützung, insbesondere in der Oberfläche. Wenn du das willst, wäre eine neue Delphiversion sehr sinnvoll (Delphi 2009+), wo der Standard-String ein UnicodeString ist.
In Delphi 7 heute noch mit TntControls oder ähnlichem herumzufrickeln und einen enormen Aufwand zu betreiben nur um hinterher bei einem Umstieg auf eine aktuelle Delphiversion irgendwann viel davon wegzuwerfen... meiner Meinung nach lohnt das nicht...

Wenn heute noch Delphi 7, dann besser ohne Unicode. (Das gilt vor allem für die Benutzeroberfläche.)

himitsu 19. Mai 2012 15:59

AW: Mit Unicode-Dateinamen arbeiten
 
Wobei FindFirst auch ohne Unicode ganz gut funktioniert.

Bis mindestens Win7/NTFS gibt es für Dateinamen alternativ noch einen "kurzen" Dateinamen im 8.3-Format,
über welchen man mit den ANSI-Funktionen zugreifen kann.

Wenn es unbedingt Unicode sein muß, dann kann man immernoch direkt auf die Unicode-WinAPI (MSDN-Library durchsuchenFindFirstFileW) ausweichen, was selbst mit Windows 7 problemlos möglich ist.
Falls man sowieso auf NonVCL setzt, dann ist es egal, was man nutzt, denn das geht genauso gut in NonUnicodeDelphis. (nur TStringList fehlt ... Bei Google suchenTTntTStringList)

Bernhard Geyer 19. Mai 2012 16:07

AW: Mit Unicode-Dateinamen arbeiten
 
Beste Lösung: Kauf dir Delphi XE2 und nutze die vollständige Unicode-Unterstützung der VCL

Zweitbeste Lösung: Such dir noch einen freien Download der TNTWare-Komponenten (oder kauf das aktuelle Package bei TMS Software). Dort gibt es viel API-Funtionen Widestring-Enabled so das sie auch unter Win9x (Als Ansi-Version) funktionieren.

Und Widestring ist 100% Unicodefähig da seit Windows 2000 statt UCS2 UTF16 verwendet wird.

blablab 19. Mai 2012 18:51

AW: Mit Unicode-Dateinamen arbeiten
 
Wenn Windows selbst nur mit WideChars arbeitet, dann reicht mir diese nicht ganz 100%ige Unicode-Unterstützung natürlich auch. Ich dachte nur, wenn ich schon extra eine Unicode-Unterstützung programmieren will, dann will ich es auch gleich ganz machen.

Aber das mit dem SysLocale.FarEast := True macht mich immernoch etwas stutzig. Ist das die "normale" Herangehensweise um (bei Delphi7) mit MultiByte-Strings zu arbeiten? Denn wie gesagt werde ich eher selten auf Unicode stoßen und dann wäre es mir am liebsten ich könnte mir die 50% Speicherplatz sparen...

Bernhard Geyer 19. Mai 2012 18:58

AW: Mit Unicode-Dateinamen arbeiten
 
Ich kann dir nur den Tipp geben deine Anwendung komplett Unicodefähig zu machen.
Die in älteren Delphi-Version "mögliche" Lösung mit Charset/Codepages ist eine Krückenlösung die mehr Probleme verursacht als löst.

Luckie 19. Mai 2012 19:38

AW: Mit Unicode-Dateinamen arbeiten
 
Windows nutzt intern UTF-16 genau wie Delphi auch.

blablab 12. Jul 2012 16:30

AW: Mit Unicode-Dateinamen arbeiten
 
@Luckie: Heißt das die Windowsfunktionen xyzW geben UTF-16 und nicht UCS-2 Werte zurück?

Bernhard Geyer 12. Jul 2012 16:44

AW: Mit Unicode-Dateinamen arbeiten
 
Zitat:

Zitat von blablab (Beitrag 1174507)
@Luckie: Heißt das die Windowsfunktionen xyzW geben UTF-16 und nicht UCS-2 Werte zurück?

Bis Windows NT waren es UCS-2 Werte, ab W2k sind es UTF-16 Werte.
Aber solange du nur Zeichen verarbeiten will die in der Base Plane liegent macht das keinen Unterschied.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:46 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