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

你不会想象使用Windows应用程序的C ++标准库打开一个文件是非常棘手的…但似乎是这样。 在这里Unicode是指UTF-8,但我可以转换为UTF-16或任何其他的,重点是从一个Unicode文件名获得一个ofstream实例。 在我开始自己的解决scheme之前,这里有一个首选路线吗? 特别是一个跨平台的?

C ++标准库不支持Unicode。 charwchar_t不需要是Unicode编码。

在Windows上, wchar_t是UTF-16,但是在标准库中没有直接支持UTF-8文件名(在Windows上char数据types不是Unicode)

使用MSVC(也就是Microsoft STL),提供了一个文件stream的构造函数,它接受一个const wchar_t*文件名,允许你创buildstream:

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

但是,这个重载不是由C ++ 11标准规定的(它只能保证基于char的版本的存在)。 对于MinGW(-w64)的GCC的libstdc ++,从版本g ++ 4.8.x开始,它也不存在于替代的STL实现中。

请注意,就像Windows上的char不是UTF8,在其他OS上, wchar_t可能不是UTF16。 总的来说,这不太可能是便携式的。 打开给定wchar_t文件名的stream没有按照标准来定义,并且在char指定文件名可能是困难的,因为char使用的编码在OS之间变化。

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

使用std::wofstreamstd::wifstreamstd::wfstream 。 他们接受unicode文件名。 文件名必须是wstringwchar_t s的数组,或者必须在文本之前有_T()macros或前缀L