除了Unihan,Unicode還有定義NFC/NFD/NFKC/NFKD四種normalization
後面兩個相容性編碼不說了,前兩個正規等價:
NFC是等價組碼
NFD是等價拆碼
在unicodedata裡面目前「拆組」對中文來說意義不大,主要是歐洲語言和韓語才有
拆組的等價性問題,比如說e上面一撇,可以是單獨一個codepoint,
也可以是e的codepoint+那一撇的codepoint
中文的組合(IDC組字)目前不在unicodedata管轄範圍
在那些unicode資料網站其實查U+FA97可以看到NFD/NFC都指向U+6D41
NFC實際上也是先經過NFD再組起來,所以對中文而言我們看NFD就好了
unicodedata的原始資料在
ftp://ftp.unicode.org/Public/7.0.0/ucd/UnicodeData.txt
不過他需要經過一些處理才能得到NFD的mapping
剛好有一份處理好的在
https://github.com/buganini/bsdconv/blob/master/modules/inter/_NFD.txt
韓文的拆組不在裡面,因為依照unicode標準定義韓文的拆組是用程式計算的
裡面去掉有拆碼的row(有逗號的)應該就都是CJK漢字了
把unicodedata轉成NFD table的程式在
https://github.com/buganini/bsdconv/blob/master/tools/unicode_gen.py
如果想要用肉眼看_NFD.txt
可以把bsdconv裝起來然後執行
bsdconv bsdconv,utf-8:utf-8 _NFD.txt