在處理Unicode字串的時候,CJK字元經常需要當作特例來處理。Rust的字串雖然是採用UTF-8編碼,但是它並沒有內建Unicode Block清單,無法查詢字元所屬的Unicode Block,也就不能判斷一個字元是不是中文、日文或韓文字元了。沒辦法,只能自己做啦!



什麼是Unicode Block?

Unicode的字元值有21個位元,將這21個位元切分區段,一個Unicode Block就位在一個區段內,彼此不會重疊。每個Unicode Block都有一個名稱,可以看作是字元的類別名稱。例如英文字母就屬於Basic Latin這個Unicode Block,區段範圍是U+0000..U+007F

一個自然語言使用的Unicode Block並不一定是連續的,一個Unicode Block也可能被多種語言使用。所以要靠Unicode Block來判斷字元屬於哪種語言,其實也不能說是一件非常輕鬆容易的事。

Unicode Blocks

「Unicode Blocks」是筆者開發的套件,包含完整的Unicode Block清單,並且提供一些函數可以做一些查詢的動作。

Crates.io

Cargo.toml

unicode-blocks = "*"

使用方法

unicode_blocks這個crate底下的常數,即是一個Unicode Block。find_unicode_block函數可以傳入一個字元,判斷這個字元屬於哪個Unicode Block。

assert_eq!(unicode_blocks::BASIC_LATIN, unicode_blocks::find_unicode_block('A').unwrap());

is_cjk_block函數可以判斷一個Unicode Block,是否屬於CJK字元的範圍。

assert!(unicode_blocks::is_cjk_block(unicode_blocks::CJK_UNIFIED_IDEOGRAPHS));

is_cjk函數可以判斷一個字元,是否是CJK字元。

assert!(unicode_blocks::is_cjk('。'));