2013-02-27 78 views
6

我正在寫一個終端(控制檯)應用程序,該應用程序應該包裝任意的unicode文本。確定一個unicode字符是全角還是半角C++

終端通常使用等寬(固定寬度)的字體,所以要包裝一個文本,它只不過是計算字符並觀察一個單詞是否適合一行,並相應地採取行動。

問題是Unicode表中有全角字符佔用終端中2個字符的寬度。

計算這些會看到1個unicode字符,但打印的字符是2「正常」(半寬)字符寬,打破了包裝例程,因爲它不知道佔用兩倍寬度的字符。

作爲一個例子,這是一個全角字符(U + 3004的JIS符號)

 
〄 
12 

它不佔用這裏2個字符的全部寬度雖然它的預格式化的,但它確實使用兩次終端中西部人物的寬度。

爲了解決這個問題,我必須區分全角或半角字符,但我找不到在C++中這樣做的方法。是否真的有必要知道unicode表中的所有全角字符來解決問題?

+1

相關http://www.icu-project.org/apiref/icu4c/uchar_8h.html#a3376f0d34bb23c54671859f1978b4226和http://www.unicode.org/reports/tr11/ – 2013-02-27 14:21:29

+0

對於哪個OS /平臺? – 2013-02-27 14:27:48

+0

對不起,我錯過了。操作系統是Linux。 – Noice 2013-02-27 14:50:32

回答

6

您應該使用帶有UCHAR_EAST_ASIAN_WIDTH屬性的ICU u_getIntPropertyValue

例如:

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聯合ACUTE ACCENT將只佔用1個單元。

+0

我即將立即將ICU的所有呼叫都替換爲最小化依存關係。也許我可以在u_getIntPropertyValue方法的幫助下構建一個包含所有全角字符的表格。感謝提供組合字符。我會檢查這是否也適用於終端。 – Noice 2013-02-27 14:53:22

+0

@Noice它可能不再適合你,但我最近把類似問題的字符範圍放在一起,在這裏:http://stackoverflow.com/a/15651264/777186 – jogojapan 2013-04-08 08:54:12

相關問題