[英]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
COMBINING ACUTE ACCENT將只占用1個單元格。
沒有必要構建表,Unicode的人已經這樣做了:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.