Gibt es eine Standardmethode eine fopen mit einem Unicode-String Dateipfad zu tun?
Frage
Gibt es eine Standardmethode eine fopen mit einem Unicode-String Dateipfad zu tun?
Lösung
* nichts, geben Sie einfach die Standard-fopen verwenden (weitere Informationen in der Antwort von TokeMacGuy sehen, oder in diesem Forum ) In Windows können Sie verwenden _wfopen, und dann eine Unicode-Zeichenfolge (für weitere Informationen übergeben, finden Sie unter MSDN ).
Da es kein wirklicher gemeinsamer Weg ist, würde ich diesen Aufruf in einem Makro wickeln, zusammen mit allen anderen systemabhängigen Funktionen.
Andere Tipps
Nein, es gibt keine Standardmethode. Es gibt einige Unterschiede zwischen den Betriebssystemen. Hier ist, wie verschiedene OSs behandeln Nicht-ASCII-Dateinamen.
Linux
Unter Linux ist ein Dateiname einfach eine binäre Zeichenfolge. Die Konvention über die meisten modernen Distributionen ist UTF-8 für Nicht-ASCII-Dateinamen zu verwenden. Aber am Anfang war es üblich, Dateinamen als ISO-8559-1 zu kodieren. Es ist im Grunde für jede Anwendung auf eine Codierung zu wählen, so dass Sie können sogar verschiedene Kodierungen im gleichen Dateisystem verwendet haben. Die LANG
Umgebungsvariable können Sie einen Hinweis, was die bevorzugte Kodierung ist. Aber in diesen Tagen, können Sie wahrscheinlich davon ausgehen, UTF-8 überall.
Das ist nicht ohne Probleme, obwohl, weil ein Dateiname eine ungültige UTF-8-Sequenz enthält, perfekt gültig ist auf den meisten Linux-Dateisystemen. Wie würden Sie eine solche Dateinamen angeben, wenn Sie UTF-8? Idealerweise sollten Sie beide UTF-8 und binäre Dateinamen unterstützen.
OS X
Das HFS-Dateisystem auf OS X verwendet Unicode (UTF-16) intern Dateinamen. Die meisten C (und POSIX) Bibliotheksfunktionen wie fopen
UTF-8-Zeichenfolgen akzeptieren (da sie sind 8-Bit-kompatibel) und wandeln sie intern.
Fenster
Das Windows-API verwendet UTF-16 für Dateinamen, aber fopen
unterstützt nur ASCII. Viele C-Bibliotheksfunktionen haben einen Nicht-Standard-Äquivalent, die UTF-16 (wchar_t
auf Windows) übernimmt. Zum Beispiel _wfopen
statt fopen
.
Dies ist eine Frage der aktuellen locale. auf meinem System, die Unicode-aktiviert ist, Dateipfade in Unicode sein. Ich bin der Lage, dies durch den Lokalisierungs-Befehl zu erkennen:
$ locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
Die Codierung von Dateipfaden ist in der Regel systemweit festgelegt, so dass, wenn Ihr Dateipfad nicht in dem System des locale ist, werden Sie sie konvertieren müssen, vielleicht mit Hilfe des iconv Bibliothek.