我正在修复一个大型开源跨平台应用程序,以便它能够在Windows上处理包含非ANSI字符的文件路径。
更新:
基于我到目前为止得到的答案和评论(谢谢!)我觉得我应该澄清几点:
std::wchar_t
。这不是一个选择。该解决方案必须与普通的ol‘std::fopen()
、std::ifstream
等一起工作。std::numpunct
方面会有效果(但我还没有成功)。我目前的解决办法包括:
.UTF-8
上的LC_CTYPE
类别(根据应用程序的要求将所有其他类别设置为C
区域设置):
//申请要求。std::setlocale(LC_ALL,"C");//在Windows上,我们希望std::fopen()和其他处理字符串//和文件路径的函数接受用UTF-8编码的窄字符字符串。#ifdef _WIN32 { #ifndef NDEBUG char* new_ctype_locale = #endif std::setlocale(LC_CTYPE,".UTF-8");断言(new_ctype_locale != nullptr);} #endifboost::filesystem::path
配置为使用en_US.UTF-8
区域设置,以便它也可以处理包含非ANSI字符的路径:
boost::filesystem::path::imbue(std::locale("en_US.UTF-8"));最后一个缺失位是使用C++流修复文件I/O,如
std::ifstream istream(filename);
最简单的解决方案可能是在应用程序开始时设置全局C++区域设置:
std::locale::global(std::locale("en_US.UTF-8"));
然而,这会扰乱数字的格式,例如1234.56被格式化为1,234.56。
是否有 just 指定编码为UTF-8而不影响数字格式(或其他东西)的区域设置?
基本上,我在寻找C.UTF-8
语言环境,但在Windows上似乎不存在这种情况。
更新:我想一种解决方案是重置一些(大多数?全部?)但是我很难找到关于如何去做的信息。
发布于 2020-01-09 02:01:51
Windows不尊重CRT语言环境,fopen
等的CRT实现直接调用窄字符API,因此更改区域设置不会影响编码。
然而,Windows20195.10更新(1903年版) 在其窄焦APIs中引入了对UTF-8的支持。。可以通过将适当的清单嵌入到可执行文件中来启用它。不幸的是,这是一个非常新的添加,因此如果您需要针对旧系统,则可能不是一种选择。
您的其他选项包括手动转换为wchar_t
或使用为您提供此功能的层(比如Boost.Filesystem,甚至更好的是Boost.Nowide)。
发布于 2020-01-08 23:42:18
https://stackoverflow.com/questions/59654829
复制相似问题