我正在编写一个应该包装任意 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/