utf8 - c++ windows programming




Wie öffne ich einen std:: fstream(ofstream oder ifstream) mit einem Unicode-Dateinamen? (3)

Die C ++ - Standardbibliothek ist nicht Unicode-fähig. char und wchar_t keine Unicode-Kodierungen sein.

Unter Windows ist wchar_t UTF-16, aber es gibt keine direkte Unterstützung für UTF-8-Dateinamen in der Standardbibliothek (der char Datentyp ist nicht Unicode unter Windows)

Mit MSVC (und damit der Microsoft STL) wird ein Konstruktor für Filestreams bereitgestellt, der einen const wchar_t* -Dateinamen verwendet, mit dem Sie den Stream wie folgt erstellen können:

wchar_t const name[] = L"filename.txt";
std::fstream file(name);

Diese Überladung wird jedoch nicht vom C ++ 11-Standard angegeben (sie garantiert nur das Vorhandensein der char Version). Es ist auch nicht auf alternativen STL-Implementierungen wie GCCs libstdc ++ für MinGW (-w64) ab Version g ++ 4.8.x vorhanden.

Beachten Sie, dass genau wie char unter Windows nicht UTF8 ist, auf anderen Betriebssystemen wchar_t möglicherweise nicht UTF16. Insgesamt ist dies wahrscheinlich nicht tragbar. Das Öffnen eines Streams mit einem Dateinamen wchar_t ist nicht gemäß dem Standard definiert, und das Angeben des Dateinamens in Zeichen kann schwierig sein, da die von Zeichen verwendete Codierung zwischen Betriebssystemen variiert.

Sie würden sich nichts Grundlegendes vorstellen, denn das Öffnen einer Datei mit der C ++ - Standardbibliothek für eine Windows-Anwendung war knifflig ... aber es scheint so zu sein. Mit Unicode hier meine ich UTF-8, aber ich kann in UTF-16 oder was auch immer konvertieren, der Punkt erhält eine ofstream-Instanz von einem Unicode-Dateinamen. Bevor ich meine eigene Lösung hacke, gibt es hier eine bevorzugte Route? Vor allem eine plattformübergreifende?



Boost.Nowide Sie einen Blick auf Boost.Nowide :

#include <boost/nowide/fstream.hpp>
#include <boost/nowide/cout.hpp>
using boost::nowide::ifstream;
using boost::nowide::cout;

// #include <fstream>
// #include <iostream>
// using std::ifstream;
// using std::cout;

#include <string>

int main() {
    ifstream f("UTF-8 (e.g. ß).txt");
    std::string line;
    std::getline(f, line);
    cout << "UTF-8 content: " << line;
}




unicode