簡體   English   中英

確定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_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 COMBINING ACUTE ACCENT將只占用1個單元格。

沒有必要構建表,Unicode的人已經這樣做了:

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

在終端仿真軟件中使用相同的代碼,例如xterm [1]konsole [2] ,很可能是其他代碼......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM