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

Ext*_*ist 50 c++ windows unicode

你不会想象像使用C++标准库为Windows应用程序打开文件那样基本的东西很棘手......但它似乎是.在这里,我指的是UTF-8,但我可以转换为UTF-16或其他任何东西,重点是从Unicode文件名中获取一个ofstream实例.在我推出自己的解决方案之前,这里有一条首选路线吗?特别是跨平台的?

jal*_*alf 57

C++标准库不支持Unicode.char并且wchar_t 不需要是Unicode编码.

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

使用MSVC(以及Microsoft STL),提供了一个const wchar_t*文件流构造函数,它采用文件名,允许您创建流:

wchar_t const name[] = L"filename.txt";
std::fstream file(name);
Run Code Online (Sandbox Code Playgroud)

但是,C++ 11标准未指定此重载(它仅保证char基于版本的存在).它也不存在于替代STL实现中,例如GCC的用于MinGW的libstdc ++(-w64),从版本g ++ 4.8.x开始.

请注意,就像char在Windows上不是UTF8一样,在其他操作系统上wchar_t可能不是UTF16.总的来说,这不太可能是便携式的.打开给定wchar_t文件名的流不是根据标准定义的,并且在chars中指定文件名可能是困难的,因为char使用的编码在OS'之间变化.

  • 一个更完整和最新的答案,包括如何使用g ++,以及其他Windows API途径等,可以在[更新的主题]中找到(http://stackoverflow.com/a/23969243/464581). (2认同)
  • 该答案自 C++17 起已过时。 (2认同)

Nik*_*lai 6

从C ++ 17开始,有一种跨平台的方法可以使用std :: filesystem :: path重载来打开具有Unicode文件名的std :: fstream 。在C ++ 20之前,您可以使用std :: filesystem :: u8path从UTF-8字符串创建路径。例:

std::ofstream out(std::filesystem::u8path(u8"?????"));
out << "hello";
Run Code Online (Sandbox Code Playgroud)

在C ++ 20之后,您可以通过将UTF-8传递给构造函数来创建路径std::filesystem::path(u8"?????"):(不建议使用u8path)。

  • 当我在 Windows 上尝试此操作时,创建的文件名为“ã”ã‚“ã«ã¡ã”。(源文件保存为UTF-8)。您还需要执行其他步骤才能使该示例创建正确的文件名吗? (2认同)