2010-02-23 9 views
10

Ich muss eine Datei als std :: fstream (oder eigentlich jede andere std :: ostream) öffnen, wenn der Dateiname "Unicode" Dateiname ist.Öffnen von fstream mit Datei mit Unicode-Dateinamen unter Windows mit Nicht-MSVC-Compiler

Unter MSVC habe ich Nicht-Standard Erweiterung std::fstream::open(wchar_t const *,...)? Was kann ich mit anderen Compilern wie GCC (am wichtigsten) und wahrscheinlich Borland Compiler tun.

Ich weiß, dass CRTL bietet _wfopen aber es gibt C FILE * Schnittstelle statt io-Streams, vielleicht ist es ein Nicht-Standard-Weg von FILE * io-Stream zu erstellen? Gibt es eine boost::ifstream mit MSVC wie Erweiterung für Windows?

+0

verwenden Sie können nicht. Unter Mac OS X wurde entschieden, dass die POSIX-Datei-APIs - und damit auch std :: fstream - alle utf-8 verwenden würden. In Umgebungen, in denen es keine plattformspezifischen Erweiterungen gibt (z. B. gcc und bc unter Windows), können die c & C++ - Laufzeitfunktionen nicht zuverlässig erwartet werden Greifen Sie auf die angegebenen Dateien des Dateisystems mit nicht-ASCII-Zeichen in ihrem Namen zu. –

+0

@Chris Ich habe keine Probleme mit der Bibliothek, die UTF-8 unterstützt - es ist perfekt für mich. Das Problem, dass Windows UTF-8 – Artyom

+0

eine hackish Workaround für MinGW nicht unterstützt, ist in http://stackoverflow.com/questions/6524821/opening-stream-via-function – marcin

Antwort

3

Derzeit gibt es keine einfache Lösung.

Sie müssen Ihren eigenen Stream-Puffer erstellen, der _wfopen unter der Haube verwendet. Sie können dafür beispielsweise boost::iostream

-3

Konvertieren Sie den Unicode-Dateinamen in eine char* Zeichenfolge mit etwas wie wcstombs() oder WideCharToMultiByte() (wodurch Sie viel mehr Kontrolle über die beteiligten Codepages erhalten).

Verwenden Sie dann den konvertierten Dateinamen, um die Datei zu öffnen.

+4

Dateiname enthält Unicode-Zeichen, die möglicherweise nicht in der aktuellen dargestellt werden Gebietsschema-Codepage (dh hebräische Zeichen können nicht in Latin1 8-Bit-Gebietsschema dargestellt werden), auch Windows unterstützt keine UTF-8-Codepages. Also nein, das geht nicht. – Artyom

7

Leider gibt es keinen Standard Weg, dies zu tun, obwohl C++ 0x (1x?) Verspricht, das zu tun. Bis dahin haben Sie richtigerweise angenommen, dass eine Lösung in Boost gefunden werden kann. Die Bibliothek, nach der Sie suchen, lautet jedoch Boost.Filesystem.

Boost.Filesystem verwendet intern standardmäßig breite Strings für sein universelles Pfadsystem, so dass es in dieser Hinsicht keine Unicode-Probleme gibt.

+0

Haben Sie eine Referenz für C++ 0X? Ich erinnere mich an Diskussionen, aber keine Schlussfolgerung, und ich fand nichts in dem letzten Entwurf. – AProgrammer

+4

Das Problem ist, dass 'boost :: filesystem' wpath unter MinGW/GCC nicht unterstützt, da die Boostkonfiguration aus irgendeinem Grund 'BOOST_NO_STD_WSTRING' definiert (sogar breite Strings funktionieren unter mingw recht gut). – Artyom

+0

Ich habe ein wenig mehr gesucht und gefunden : http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#454, scheinbar keine Lösung vor der Bibliothek TR2. – AProgrammer

Verwandte Themen