架 (U+67B6) 与en_US不符.UTF-8.这是怎么回事?
架 (U+67B6) is not graphical with en_US.UTF-8. Whats going on?
这是一个后续问题:
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 之类的东西。
相关文章:
- HEX值到wchar_t字符(UTF-8)的转换
- 带有Protobuf序列化的C++Hazelcast:字符串不是UTF-8格式的
- 转换特殊字符(UTF-8)
- 如何在CPP的给定目录中列出UTF编码的文件名?
- 如何使用 C++将 ISO-2022-KR 编码转换为 UTF-8 编码?
- 在C++中使用 UTF-8 字符串和字符
- 如何将 UTF-8 文本从文件转换为某个可以迭代的容器,并检查每个符号是否为C++字母数字?
- 将C++ std::string 转换为 UTF-16-LE 编码的字符串
- 在基于英语的系统上将 UTF-8 路径转换为宽字符会引发异常
- C++ 将 UTF-8 转换为字符串
- 从/到 UTF-8/UTF-16 的转换需要(例如:utf8 -> 代码点,然后代码点到 utf16)或(例如:utf8 -> utf16)?
- 通过分隔符分隔包含 UTF-16 BE 文本的uint8_t数组
- 一种从内存中删除 UTF 字节的方法?
- "C.UTF-8" C++ Windows 上的语言环境?
- 无法将字符数组转换为包含 utf-8 字符的字符串
- 从 UTF-8 字节数组创建字符串?
- 如何在C++中使用 UTF-8 和 Unicode?C++20 char8_t有多大?
- PostgreSQL C++ libpq 编码 UTF-8 问题
- QTcpServer/QTcpSocket:使用 QDataStream 与直接发送 UTF-8 数据
- 架 (U+67B6) 与en_US不符.UTF-8.这是怎么回事?