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




string windows (5)

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?


Answers

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;
}

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.


Verwenden Sie std::wofstream , std::wifstream und std::wfstream . Sie akzeptieren Unicode-Dateinamen. Dateiname muss wstring , Array von wchar_t s, oder es muss _T() Makro haben, oder Präfix L vor dem Text.



Sieh dir das an:

string str1("");
const char * str2 = str1.c_str();

Beachten Sie jedoch, dass dies ein const char * zurückgibt. Für ein char * verwenden Sie strcpy um es in ein anderes char Array zu kopieren.





c++ windows unicode