为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

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

3 回答

?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

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所使用的编码在操作系统之间有所不同。


查看完整回答
反对 回复 2019-10-21
?
凤凰求蛊

TA贡献1825条经验 获得超4个赞

从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)。


查看完整回答
反对 回复 2019-10-21
  • 3 回答
  • 0 关注
  • 1170 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信