c++ - 使用 std::locale 格式化法语数字时,UTF-8 数据无效

标签 c++ utf-8 locale std

我正在使用以下代码使用正确的语言环境来格式化数字。使用法语时,数字在数字组之间具有“不间断空格”。我得到的字符串似乎无效。

    std::stringstream ss;
    ss.imbue(std::locale("fr_FR.UTF-8"));
    ss << 1234;
    auto result = ss.str();

在这里,result是:{49, -62, 50, 51, 52} .不间断空格用 -62 表示。在我看来它是无效的 UTF-8,对吧?

我期待 result为:{49, -62, -96, 50, 51, 52} (在这种情况下,这似乎有效,不间断空格用两个字符表示:-62、-96)。

我错过了什么吗?谢谢你的帮助。

最佳答案

问题是std::locale不支持多字节数字分隔符,因为 std::numpunct::thousands_sep 仅返回单个代码单元(在本例中为 char)。因此,在您的情况下,数字分隔符 NO-BREAK SPACE 0xC2 (-62) 0xA0 (-96)被截断,您只能看到第一个代码单元 0xC2 (-62)这是无效的部分 UTF-8。

关于c++ - 使用 std::locale 格式化法语数字时,UTF-8 数据无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61799547/

相关文章:

android - 在不同的语言环境中测试 Android 应用程序

c++ - 如何更改 VS2008 中的构建语言?

c++ - gcc 相当于 VC++ 警告 C4018 : signed/unsigned mismatch

c++ - 与 dylib ld : library not found for -lcrt0. ocollect2 的静态链接:错误:ld 返回 1 退出状态

php - 在 PHP 中生成加密 key ,可以直接放在 C++ 代码中进行解密

java - Spring MVC Tomcat 编码 UTF-8

c++ - 如何让 RakNet 更可靠?

php - 包含非 ASCII 字符的字符串会被 PHP/MySQL 截断

python - 枚举utf-8字符串的最简单方法

C++ 将区域设置全局重置为 "C"?