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

您不会想到像使用针对Windows应用程序的C ++标准库打开文件这样的基本操作是棘手的……但是看起来确实如此。这里所说的Unicode是指UTF-8,但是我可以转换为UTF-16或其他任何形式,关键是要从Unicode文件名获取一个ofstream实例。在整理自己的解决方案之前,这里有首选的方法吗?尤其是跨平台的一个?



明月笑刀无情
浏览 1171回答 3
3回答

尚方宝剑之说

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);但是,C ++ 11标准未指定此重载(它仅保证存在char基于版本的版本)。从g ++ 4.8.x版本开始,它也未出现在替代STL实现中,例如用于MinGW(-w64)的GCC libstdc ++。请注意,就像char在Windows上不是UTF8一样,在其他OS上wchar_t也可能不是UTF16。因此,总的来说,这不太可能移植。wchar_t根据标准未定义打开给定文件名的流,并且在chars中指定文件名可能很困难,因为char所使用的编码在操作系统之间有所不同。

凤凰求蛊

从C ++ 17开始,有一种跨平台的方法可以使用std :: filesystem :: path重载来打开具有Unicode文件名的std :: fstream 。在C ++ 20之前,您可以使用std :: filesystem :: u8path从UTF-8字符串创建路径。例:std::ofstream out(std::filesystem::u8path(u8"こんにちは"));out << "hello";在C ++ 20之后,您可以通过将UTF-8传递给构造函数来创建路径std::filesystem::path(u8"こんにちは"):(不建议使用u8path)。
打开App,查看更多内容
随时随地看视频慕课网APP