在處理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('。'));