首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Windows上的"C.UTF-8“C++语言环境?

Windows上的"C.UTF-8“C++语言环境?
EN

Stack Overflow用户
提问于 2020-01-08 22:42:44
回答 2查看 6.2K关注 0票数 5

我正在修复一个大型开源跨平台应用程序,以便它能够在Windows上处理包含非ANSI字符的文件路径。

更新:

基于我到目前为止得到的答案和评论(谢谢!)我觉得我应该澄清几点:

  1. 我无法修改数十个第三方库的代码以使用std::wchar_t。这不是一个选择。该解决方案必须与普通的ol‘std::fopen()std::ifstream等一起工作。
  2. 下面我概述的解决方案的工作效率为99%,至少在我正在开发的系统上(Windows10Version1909,build 18363.535)。我还没在其他系统上测试过。 剩下的唯一问题,至少在我的系统上,基本上是数字格式,我希望替换std::numpunct方面会有效果(但我还没有成功)。

我目前的解决办法包括:

  1. 将C语言环境设置为.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);} #endif
  2. boost::filesystem::path配置为使用en_US.UTF-8区域设置,以便它也可以处理包含非ANSI字符的路径: boost::filesystem::path::imbue(std::locale("en_US.UTF-8"));

最后一个缺失位是使用C++流修复文件I/O,如

代码语言:javascript
运行
复制
std::ifstream istream(filename);

最简单的解决方案可能是在应用程序开始时设置全局C++区域设置:

代码语言:javascript
运行
复制
std::locale::global(std::locale("en_US.UTF-8"));

然而,这会扰乱数字的格式,例如1234.56被格式化为1,234.56。

是否有 just 指定编码为UTF-8而不影响数字格式(或其他东西)的区域设置?

基本上,我在寻找C.UTF-8语言环境,但在Windows上似乎不存在这种情况。

更新:我想一种解决方案是重置一些(大多数?全部?)但是我很难找到关于如何去做的信息。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-01-09 02:01:51

Windows不尊重CRT语言环境,fopen等的CRT实现直接调用窄字符API,因此更改区域设置不会影响编码。

然而,Windows20195.10更新(1903年版) 在其窄焦APIs中引入了对UTF-8的支持。。可以通过将适当的清单嵌入到可执行文件中来启用它。不幸的是,这是一个非常新的添加,因此如果您需要针对旧系统,则可能不是一种选择。

您的其他选项包括手动转换为wchar_t或使用为您提供此功能的层(比如Boost.Filesystem,甚至更好的是Boost.Nowide)。

票数 3
EN

Stack Overflow用户

发布于 2020-01-08 23:42:18

别管地点了。

在Windows上,您应该使用微软的扩展,将const std::wchar_t* (预期指向UTF-16)的构造函数添加到std::ifstream

希望您的所有字符串都是UTF-8,或者其他一些一致的、合理的编码。

因此,只需抓取一个UTF-8→UTF-16转换器(它们是轻量级的),并将文件名作为UTF-16传递给std::ifstream (在std::wchar_t*中)。

(一定要将其#ifdef出来,这样就不会在任何其他平台上尝试它。)

出于同样的原因,您也应该以同样的方式使用_wfopen而不是std::fopen

就这样。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59654829

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档