c++ - 在 C++ 中确定一个 unicode 字符是全角还是半角

标签 c++ unicode

我正在编写一个应该包装任意 unicode 文本的终端(控制台)应用程序。

终端通常使用等宽(固定宽度)字体,因此要包装文本,只不过是计算字符数并观察单词是否适合一行并采取相应行动。

问题是 Unicode 表中的全角字符占用了终端中 2 个字符的宽度。

计算这些会看到 1 个 unicode 字符,但打印的字符是 2 个“正常”(半角)字符宽,打破了包装例程,因为它不知道占用两倍宽度的字符。

例如,这是一个全角字符(U+3004,JIS 符号)

〄
12

虽然它是预格式化的,但它在这里不占用 2 个字符的全部宽度,但它确实在终端中使用了西方字符宽度的两倍。

为了处理这个问题,我必须区分全角字符或半角字符,但我找不到在 C++ 中这样做的方法。真的有必要知道 unicode 表中的所有全角字符来解决这个问题吗?

最佳答案

你应该使用 ICU u_getIntPropertyValue使用 UCHAR_EAST_ASIAN_WIDTH 属性。

例如:

bool is_fullwidth(UChar32 c) {
    int width = u_getIntPropertyValue(c, UCHAR_EAST_ASIAN_WIDTH);
    return width == U_EA_FULLWIDTH || width == U_EA_WIDE;
}

请注意,如果您的图形库支持组合字符,那么在确定一个序列使用多少个单元格时,您也必须考虑这些;例如 e 后跟 U+0301 COMBINING ACUTE ACCENT 将只占用 1 个单元格。

关于c++ - 在 C++ 中确定一个 unicode 字符是全角还是半角,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15114303/

相关文章:

c++ - 在 Boost 序列化中展平嵌套的命名值对

c++ - 如何在 C++ 中使用 HRESULT 条件检查

python - Unicode解码错误: 'ascii' codec can't decode byte 0xaa in position 2370: ordinal not in range(128)

c++ - 如何编写将自身作为回调传递的匿名函数/lambda?

模仿 matlab 功能的 C++ 库

c++ - 如果我的容器介于两个现有值之间,那么捏造迭代器类别是否合理?

python - 帮助我理解为什么 Unicode 有时只适用于 Python

ios - 与包含它们的字符集相比,只有 2 个表情符号返回不正确的长度

c++ - C++中的字符串到下/上

r - 在 R、Rmd、knitr、bookdown 中打印 UTF-8 字符