如何用unicode文件名打开std :: fstream(ofstream或ifstream)?
你不会想象使用Windows应用程序的C ++标准库打开一个文件是非常棘手的…但似乎是这样。 在这里Unicode是指UTF-8,但我可以转换为UTF-16或任何其他的,重点是从一个Unicode文件名获得一个ofstream实例。 在我开始自己的解决scheme之前,这里有一个首选路线吗? 特别是一个跨平台的?
C ++标准库不支持Unicode。 char
和wchar_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::wofstream
, std::wifstream
和std::wfstream
。 他们接受unicode文件名。 文件名必须是wstring
, wchar_t
s的数组,或者必须在文本之前有_T()
macros或前缀L