UniHan windows
這幾天琢磨着怎麼方便的給漢字註音, 由於要知道具體哪些Unicode是給漢字用的, 就讀了讀Unicode的官方文檔. 目前unicode已經發展到了7.0. 不看不知道, 發現Unicode的定義中很有些有趣的內容, 寫下了給你們分享下, 也算是個筆記. 編碼
Unicode中跟漢字相關統稱爲UniHan, 官方文檔在http://www.unicode.org/reports/tr38/spa
其中經常使用的縮寫叫CJK, 就是中日韓的意思, 顯然是把三種基於漢語的文字列在一塊兒. 翻譯
此文檔內容講了一大堆, 基本意思就是說這三種文字是同源的, 有不少統一的地方, 也有衆多差別. Unicode中的文字並非本身發明的或直接研究的成果, 而都是對各類現有權威資料的彙總和總結, 好比簡體字主要基於中國的國標, 什麼GB12345等. 除了定義每一個字的字形和code point外, 還從其餘資料中搜集了其餘信息, 如拼音, 異體字, 筆畫,簡單的英文翻譯,部首,康熙字典部首... 3d
就拿其中我比較關心的拼音來講, uniHan有一個zip包, 叫UniHan.zip, ftp://www.unicode.org/Public/zipped/7.0.0/unihan.zip code
其中文件UniHan_Readings.txt就包含了各類拼音信息. 截圖以下: xml
U+6F84就是漢字"澄"的code point, 從上面咱們能夠看到: 一個英語定義 kDefinition, blog
用廣東話定義的發音kCantonese, kHanyuPinyin是<漢語大字典>中對此字的發音定義; kMandarin描述的是這個字在普通話中最經常使用的發音(對多音字有意義); 而其餘日語韓語的部分我就看不懂了, 懂行的一看便知. ip
根據文檔TR38記錄, Unicode中的拼音蒐集了四種unicode
現代漢語頻率詞典
漢語大字典
經常使用發音
現代漢語詞典
這個只是text格式的, 比較容易分析, 其餘連接還有xml格式的, 我就很少說了.
文章中提到了X,Y,Z三軸的說法, 大概意思就是說全部的漢字均可以定位在X,Y,Z三個座標軸上, 這是爲了創建各個文字字形與其含義之間的關係. X軸表明含義,Y軸表明某個具體意思的字的各類字形, 而Z軸就是字形的小變形, 舉個例子說: "說" "貓"兩個字有徹底不一樣的意思, 因此在X軸上是兩個不一樣的值; "貓" 和 "貓"就是一個意思, 全部他們的X軸的值是相同的, 但因爲字形有很大差別, 因此Y的值是不同的; 而 "說"和"説"兩個字X軸Y軸都是同樣的, 但因爲其寫法的小差別,他們的Z值是不一樣的.
下面說說unihan 中字符的code point分佈.
簡單的說, 跟中文有關的有兩個大部分, 一部分是各類漢字和日韓文字;另外一部分是輔助的東西, 如偏旁部首, 全字符的英文, 全字符的標點符號,諸如此類.
先說基本的部分:漢字
漢字中最大的一部分叫CJK Unified Ideographs(中日韓統一表意符號集) U+4E00 – 9FCC
隨後又有屢次補充擴展
CJK Unified Ideographs Extension A
U+3400 – U+4DB5
CJK Unified Ideographs Extension B
U+20000 – U+2A6D6
CJK Unified Ideographs Extension C
U+2A700 – U+2B734
CJK Unified Ideographs Extension D
U+2B740 – U+2B81D
在這些extension以外,是幾個爲了兼容性而保留的幾個區域
CJK Compatibility Ideographs U+F900 – U+FAD9
CJK Compatibility Supplement U+2F800 – U+2FA1D
(仔細看下面截屏, 每一個字都等價對應到另外一個code point)
說完了漢字, 後面相關的部分就比較亂了, 我就隨便猜想了:
CJK Phonetics and Symbols Area 偏旁部首吧 U+2E80-U+2EF3
Kangxi Radicals康熙字典裏的偏旁部首? U+2F00 – U+2FD5
CJK Ideographic Description Characters 用來描述漢字結構的符號,如左右結構,上中下結構等 U+2FF0 - U+2FFB
CJK Symbols and Punctuation 符號 U+3000 -303F
Bopomofo 老拼音? U+3105-312D, U+31A0 – U+31B7
CJK strokes 筆畫 U+31C0 – U+31E3
Enclosed CJK Letters and Months 其它奇奇怪怪的東西, 包括月份等等, 懷疑有沒有人用啊 U+3220 – U+32CB
CJK Compatibility 另外不少奇葩的東西 U+3358-U+33FE
再有更過度的我就不都列了, 如易經八卦,麻將牌之類(是的, 麻將牌也能進Unicode, 震驚中)
其餘
說完了UniHan, 說點兒別的相關的. 首先是平面分佈的問題. 由於目前全部的unicode的code point都分佈在0 到 0x10FFFF之間, 因此簡單粗暴的根據每一個字符的最高5個bit,分紅17層, 第0層就是0-0xFFFF;1層就是0x10000 =0x1FFFF;2層爲0x20000 – 0x2FFFF;以此類推;最後一層(16層) 0x100000 – 0x10FFFF. (真的好險, 層數在多點兒就能夠和地獄比比了)
Anyway, 漢字主要分佈在0層,個別分佈在2層. 由於幾乎全部人都基本工做在0層的,因此0層又稱爲BMP(Basic Multilingual Plane).
最後在聊點encoding, 在windows平臺上最經常使用的是UTF-16, 也就是用16bit爲單位來表達unicode. 那麼哪些變態的超過0xFFFF的字符怎麼辦呢? 很簡單, 在unicode中0-0xFFFF中預留了一塊區域0xD800 – 0xDFFF是不容許任何字符集使用的, 這部分就被UTF-16用來編碼. 編碼的方式很簡單, 超過0xFFFF的字符最大是16層的0x10FFFF, 共21位, 因此無論三七二十一, 全部大於0xFFFF的字符在編碼前先減去0x10000, 這樣的結果就是最多隻有20位了, 而後一分二, 分爲高10位和低10位;高10爲與0xD800或一下, 獲得的結果就是在0xD800到0xDFFF之間, 叫lead surrogate或者high surrogates; 低10位與0xDC00或一個(就是作個加法), 獲得的結果就是trail surrogate或low surrogates. 搞定.
多加一句, 所謂的UCS-2是UTF-16的前身, UCS最大隻支持到0xFFFF, 他的字符是定寬的, 沒有surrogate一說, 它不能表達unicode的全部字符.