[ICU]處理 Big5 (含難字) to Unicode家族 Guide
從出道至今, 每年總會出現專案要處理這個問題, 整理一下如果是初學者的話, 要如何解決這個問題.
先簡單的說, Unicode 就是一個世界地址, Big5 就是一個台灣地址,
Unicode 說: U311A
Big5說: \xA3\xAB
但字型都是 "ㄚ"
而轉碼就是要處理 兩者的對應, 以字符集的Table 來看:
U311A | \xA3\xAB
(一) 應該要先讀些什麼
1. 簡單讀讀Unicode
2. 其實UTF-8最紅
3. 漢文其實是同源?!
4. 大五碼 Big5 真是萬惡之源
5. 如果你很有空, 可以去看一下Unicode.org
現在你應該要懂得什麼是:
單位元組字符集
雙位元組字符集
高位位元組
低位位元組
分區
常用漢字區(標準字區)
造字區
可變長度字元編碼, Unicode的實作方式, Unicode轉換格式(註: UTF)
然後你將自己回到198x年, 那時Big5 沒有 "碁" 這個字, 你該怎麼做
....
....
有人這麼做(其+石)
...
...
有人用了造字區, 而且給了 "碁" 只能在其系統可識別的字碼.
...
...
然後有很多"有人"及"其系統", 接著我們要來整合或是交換訊息, "碁"到底是什麼字碼?!
(二) 選用一個工具來轉碼
我們需要的工具是
1. 可以除標準及造字區的字區對應外, 亦可以自行客制化(Stateful)其字碼表.
2. 效能佳
我推薦 ICU - International Components for Unicode
又要讀書了, 你應該直接去看 User Guide Convert
Conversion
· Conversion Basics
· Converter
· Conversion Data
下載工具: http://site.icu-project.org/download
如果你試著想找uconv.exe的使用指南, 請下載並解壓縮後, 用 uconv.exe /?
要再詳細的文件, 很抱歉我沒找到, 也許你可以找到.
Ok, 現在你應該知道ICU 的機制了,
你可以編寫你自己的UCM檔,
然後用makeconv.exe 產生編譯過後的CNV檔給uconv.exe 來進行轉換.
但要注意的一點, 不同版本的CNV檔可能無法相容, 唯 UCM 不會有向後相容的問題.
ICU 已經收集了大部份語言的UCM檔, 你可以去 這個點 下載.
一般我都是依平台來選擇擴充及修改, 如: windows-950-2000.ucm
1. code_set_name 設定一個 unique 的名稱, 它將與UCM, CNV同名.
2. icu:state 因為Big5是雙位元組, 所以會有2組, 分別代碼高位及低位 , 這是一個ICU-MBCS的檢查UCM機制, 一定要訂對, 因為不在規範的分區內, 會無法編譯成功.
借用WIKI的話: 「高位位元組」使用了0x81-0xFE,「低位位元組」使用了0x40-0x7E
來解釋以下部份的內容 (註: 裡頭有一段是ASCII及造字區)
<icu:state> 40-7e, a1-fe
3. CHARMAP
# Table Version : 1.0
# The 1st column is the Unicode scalar value.
# The 2nd column is the codepage byte sequence.
# The 3rd column is the fallback indicator.
# The fallback indicator can have one of the following values:
# |0 for exact 1-1 roundtrip mapping
# |1 for the best fallback codepage byte sequence.
# |2 for the substitution character
# |3 for the best reverse fallback Unicode scaler value
CHARMAP
#
#UNICODE 950
#_______ _________
<U0000> \x00 |0
<U0001> \x01 |0
<U0002> \x02 |0
<U0003> \x03 |0
最難處理的就是 fallback indicator, 我找到最簡單的說明載點
簡單說明訂Indicator的規則:
1. 同一UNICODE 只能有1個indicator. (1:1)
2. 若有2個BIG5對到同一個UNCODE 則訂2筆, 副者為"3"
3. 若有2個UNCODE對到同一個BIG5 則訂2筆, 副者為"1"
一般而言會遇到的另一個問題是標準對應或造字區優先 ?
(三) 簡單的範例
當你依照文件一一地做完, 會發現uconv.exe吃不到cnv檔 !!
解決方案: CNV檔如何餵給uconv呢? 你必須去設定環境變數 ICU_DATA , 如下
1: SET ICU_DATA=%ICU_HOME%\data
2:
3: makeconv -d %ICU_DATA%\icudt49l %ICU_DATA%\x-big5.ucm
請注意 icudt49l 這個資料夾, 是放置CNV的地方喔!! 規則是 icudt__l , 中間空白處是版本.
然後執行再執行指令即可
1: uconv -f x-big5 -t utf-8 --add-signature -i -o %ICU_TEST%\x-big5_test_utf8.txt %ICU_TEST%\x-big5_test.txt
(四) 字碼 , 字型 , 輸入法 ?!
轉碼成功, 但看不到字?! 因為字型內並沒有相對字碼的顯示字, 詳參考(造字 ttf tte otf)
無法用輸入法打出難字?! 請參考(內碼輸入法)
==========================
如果你有力氣讀到這裡, 最後一個坡就是 BOM, 我想應該不用我多解釋了.