gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:21:54 27 4
gpt4 key购买 nike

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com