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文件名(char
Windows上的数据类型不是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
文件名的流不是根据标准定义的,并且在char
s中指定文件名可能是困难的,因为char使用的编码在OS'之间变化.
从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)。
归档时间: |
|
查看次数: |
51037 次 |
最近记录: |