Gibt es eine Standardmethode eine fopen mit einem Unicode-String Dateipfad zu tun?

StackOverflow https://stackoverflow.com/questions/396567

  •  29-08-2019
  •  | 
  •  

Frage

Gibt es eine Standardmethode eine fopen mit einem Unicode-String Dateipfad zu tun?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top