[C++] Gibt es eine Standardmethode, um einen Fopen mit einem Unicode-String-Dateipfad auszuführen?


Answers

Nein, es gibt keinen Standardweg. Es gibt einige Unterschiede zwischen Betriebssystemen. Hier erfahren Sie, wie verschiedene Betriebssysteme Dateinamen im Nicht-ASCII-Format verarbeiten.

Linux

Unter Linux ist ein Dateiname einfach eine Binärzeichenfolge. Die Konvention für die meisten modernen Distributionen besteht darin, UTF-8 für Nicht-ASCII-Dateinamen zu verwenden. Aber am Anfang war es üblich, Dateinamen als ISO-8559-1 zu kodieren. Es ist grundsätzlich Sache jeder Anwendung, eine Kodierung zu wählen, so dass Sie sogar verschiedene Kodierungen verwenden können, die auf demselben Dateisystem verwendet werden. Die Umgebungsvariable LANG kann Ihnen einen Hinweis auf die bevorzugte Codierung geben. Aber heutzutage kann man überall UTF-8 vermuten.

Dies ist jedoch nicht ohne Probleme, da ein Dateiname, der eine ungültige UTF-8-Sequenz enthält, in den meisten Linux-Dateisystemen einwandfrei gültig ist. Wie würden Sie einen solchen Dateinamen angeben, wenn Sie nur UTF-8 unterstützen? Idealerweise sollten Sie sowohl UTF-8 als auch binäre Dateinamen unterstützen.

OS X

Das HFS-Dateisystem unter OS X verwendet Unicode-Dateinamen (UTF-16) intern. Die meisten C- (und fopen ) Bibliotheksfunktionen wie fopen akzeptieren UTF-8-Zeichenfolgen (da sie 8-Bit-kompatibel sind) und konvertieren sie intern.

Windows

Die Windows-API verwendet UTF-16 für Dateinamen, aber fopen unterstützt nur ASCII. Viele C-Bibliotheksfunktionen haben ein Nicht-Standardäquivalent, das UTF-16 akzeptiert ( wchar_t unter Windows). Zum Beispiel _wfopen anstelle von fopen .

Question

Gibt es eine Standardmethode, um einen Fopen mit einem Unicode-String-Dateipfad auszuführen?