确定unicode字符在c++中是全宽还是半宽

determine whether a unicode character is fullwidth or halfwidth in C++

本文关键字:unicode 字符 c++ 确定      更新时间:2023-10-16

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

终端通常使用等宽(固定宽度)字体,所以要换行文本,它只不过是数字符和观察一个单词是否适合一行,并采取相应的行动。

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

计算这些字符将看到1个unicode字符,但打印的字符是2个"正常"(半宽)字符宽,破坏了换行例程,因为它不知道占用两倍宽度的字符。

作为一个例子,这是一个全宽字符(U+3004, JIS符号)

<>之前〄12之前

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

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

您应该使用ICU u_getIntPropertyValueUCHAR_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 +急性重音只占1个单元格

没有必要构建表,Unicode的人已经这样做了:

http://www.cl.cam.ac.uk/mgk25/ucs wcwidth.c

同样的代码用于终端仿真软件,如xterm [1], konsole[2]和很可能的其他…