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

问题描述 投票:2回答:1

我使用下面的代码来格式化数字,使用正确的地方语言。当使用法语时,数字组之间有 "非中断的空间"。我得到的字符串似乎是无效的。

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

我是否遗漏了什么?谢谢您的帮助。

c++ utf-8 locale std
1个回答
5
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.