架 (U+67B6) 与en_US不符.UTF-8.这是怎么回事?

架 (U+67B6) is not graphical with en_US.UTF-8. Whats going on?

本文关键字:UTF-8 不符 怎么回事 US U+67B6 en      更新时间:2023-10-16

这是一个后续问题:

std::isgraph断言,如何解决?

将区域设置设置为"en_US.UTF-8",std::isgraph不再断言。

但是,在同一函数中,unicode 字符架 (U+67B6( 被报告为false。这是怎么回事?

它是建立在Windows平台上的Unicode。

如果要测试太大而无法放入unsigned char的字符,则可以尝试使用宽字符版本或已经建议的Unicode库(这对于可移植代码来说确实是更好的选择,因为它消除了任何基于系统或区域设置的行为差异(。

此程序:

#include <clocale>
#include <cwctype>
#include <iostream>
int main() {
wchar_t x = L'u67B6';
char *loc = std::setlocale(LC_CTYPE, "");
std::wcout << "Using locale " << loc << ".n";
std::wcout << "Character " << x << " is graphical: " << std::boolalpha
<< static_cast<bool>(std::iswgraph(x)) << 'n';
return 0;
}

在我的 Ubuntu 测试系统上编译和运行时,输出

Using locale en_US.utf8.
Character 架 is graphical: true

你说你正在使用Windows,但我没有Windows计算机可供测试,所以我无法确认这是否在那里工作。

std::isgraph不是Unicode感知函数。

这是来自C的古代。

从文档中:

如果 ch 的值不能表示为无符号字符且不等于 EOF,则行为未定义。

只需要int,因为..它是C的古代。就像std::tolower.

您应该改用 ICU 之类的东西。