MinGW C ++:使用非ascii文件名读取文件

时间:2016-09-20 12:45:27

标签: c++ windows unicode mingw fstream

简单任务:我想读取一个具有非ascii文件名的文件。

在linux和MacOS上,我只是将文件名作为UTF-8编码的字符串传递给fstream构造函数。在Windows上,这会失败。

据我从this question了解到,windows根本不支持utf-8文件名。但是,它提供了一个自己的非标准open方法,它采用utf-16 wchar_t*。因此,我可以简单地将string转换为utf-16 wstring并且没问题。但是,在MinGW标准库中,wchar_t* open的{​​{1}}方法根本不存在。

那么,如何在MinGW上打开非ascii文件名?

2 个答案:

答案 0 :(得分:1)

之前我曾遇到过同样的问题。不幸的是,在您使用std::filesystem::path之前,您需要以某种方式解决此问题,例如通过包装一切,例如就像我做here一样,这使得"用户代码"看起来像这样:

auto stream_ptr = open_ifstream(file_name); // I used UTF-8 and converted to UTF-16 on Windows as in the code linked above
auto& stream = *stream_ptr;
if(!stream)
    throw error("Failed to open file: \'" + filename + "\'.");

丑陋的是,有点便携,是的。请注意,这在Windows上的Libc ++上不起作用,尽管这种组合目前无法正常运行,但并不重要。

答案 1 :(得分:1)

您可以试试Boost.Nowide。它有一个fstream包装器,可以自动将您的字符串转换为UTF-16。它尚未得到提升,但已经在review schedule(并且很快就会成为提升的一部分)。我从来没有和mingw一起尝试过,但是在视觉工作室里玩了一遍,发现它整齐了。