How to open an std::fstream (ofstream or ifstream) with a unicode filename?

You wouldn't imagine something as basic as opening a file using the C++ standard library for a Windows application was tricky ... but it appears to be. By Unicode here I mean UTF-8, but I can convert to UTF-16 or whatever, the point is getting an ofstream instance from a Unicode filename. Before I hack up my own solution, is there a preferred route here ? Especially a cross-platform one ?


The C++ standard library is not Unicode-aware. char and wchar_t are not required to be Unicode encodings.

On Windows, wchar_t is UTF-16, but there's no direct support for UTF-8 filenames in the standard library (the char datatype is not Unicode on Windows)

With MSVC (and thus the Microsoft STL), a constructor for filestreams is provided which takes a const wchar_t* filename, allowing you to create the stream as:

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

However, this overload is not specified by the C++11 standard (it only guarantees the presence of the char based version). It is also not present on alternative STL implementations like GCC's libstdc++ for MinGW(-w64), as of version g++ 4.8.x.

Note that just like char on Windows is not UTF8, on other OS'es wchar_t may not be UTF16. So overall, this isn't likely to be portable. Opening a stream given a wchar_t filename isn't defined according to the standard, and specifying the filename in char s may be difficult because the encoding used by char varies between OS'es.


当前版本的Visual C ++ std :: basic_fstream有一个open()方法,它根据http://msdn.microsoft.com/en-us/library/4dx08bh4.aspx采用wchar_t *。


Use std::wofstream , std::wifstream and std::wfstream . They accept unicode filename. File name has to be wstring , array of wchar_t s, or it has to have _T() macro, or prefix L before the text.

链接地址: http://www.djcxy.com/p/54636.html

上一篇: 平台Java方法来删除文件名特殊字符?

下一篇: 如何用unicode文件名打开std :: fstream(ofstream或ifstream)?