使用 std::locale 设置法语数字格式时 UTF-8 数据无效

Invalid UTF-8 data when using std::locale to format numbers in French

我正在使用以下代码使用正确的区域设置来格式化数字。使用法语时,数字组之间有 "non-breaking space"。我得到的字符串似乎无效。

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

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

我希望 result 是:{49, -62, -96, 50, 51, 52}(在这种情况下,这似乎是有效的,不间断的 space 用两个字符表示:-62、-96) .

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

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