确定unicode字符在c++中是全宽还是半宽
determine whether a unicode character is fullwidth or halfwidth in C++
我正在编写一个终端(控制台)应用程序,它应该包装任意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
+急性重音只占1个单元格
没有必要构建表,Unicode的人已经这样做了:
http://www.cl.cam.ac.uk/mgk25/ucs wcwidth.c
同样的代码用于终端仿真软件,如xterm
[1], konsole
[2]和很可能的其他…
相关文章:
- 如何存储 unicode 字符并将其输出到文件?
- C++:打印 Unicode 字符
- 在 Windows 中使用 boost::p rogram_options 从命令行参数读取 Unicode 字符
- 获取Unicode字符C++的十进制值
- 用wchar_t处理 unicode 字符好吗?它不会引起任何问题吗?
- C++:如何将 unicode 字符打印到文本文件
- 动态计算 unicode 字符
- 如何将整数转换为 unicode 字符
- C++20 中的严格别名规则是否允许标准 c++ unicode 字符和下划线类型之间"reinterpret
- MessageBox打印来自TCHAR缓冲区的额外Unicode字符
- 如何将小数NCR转换为Unicode字符(C )
- SQLGetPrivateProfileString 错误地读取 Unicode 字符
- 将 Unicode 字符/字符串写入文件
- 将 Unicode 字符存储在.txt文件中的新行中
- 从终端 C++ 中的字符串中打印出 unicode 字符
- Unicode 字符分类与 boost::locale
- 字符数组中的滤波器unicode字符
- Unicode 字符问题/转换参数
- 从包含Unicode字符的文件中读取
- 从ASCII到Unicode字符代码的转换(FreeType2)