全部博文(1144)
分类: LINUX
2005-05-01 11:47:16
會寫這篇文章是因為想討論看看 Big5e 是否有推行的必要性,以及此方案的可行性和大家對這個編碼的看法,順便整理一下自己對 Big5 的觀念。此篇文章只介紹 Big5 與 Big5e(使用於政府行政機關),並不會多著墨於 CNS11643(公文交換系統用)、CCCII(只使用於圖書館OPAC系統)、Unicode(這個大家最熟了~)。
當開始蒐集資料後,覺得 Big5e 只能是一個過渡方案,大家且聽我慢慢道來。本文還有許多疏漏之處,還請大家多多指教。
游錫方方土任民進黨秘書長 |
游錫方方土?台灣開始有五個中文漢字的人名了呀?無意開政治人物的玩笑,只是為何不直接將那字打出來就好了,還要拆開來打呢,實際上 堃(方方土) 在我們常用的 Big5 的編碼下是不存在的,這造成了我們無法輸入、輸出、顯示 堃(方方土)。
在介紹編碼前,先介紹另一個名詞:字集(Character Set), 字集是一組符號或文字的組合,而編碼(Encoding)則是將這一組符號或文字以適當的方式編入位元組中,以便電腦能夠表示與儲存。在許多情況下,由於一個編碼方式所能容納的字數是有限的,所以可能一個編碼沒辦法包含整個字集,例如,Big5 編碼只是中文字集的一部分。當然也有一個編碼包含許多字集的,例如 Unicode 的目標是包含所有字集。
英文系統內一樣有編碼。以一字節八位(8BITS)排列,共可得256個組合,即0至255。但由於英文字母加上大小寫及常用的符號後,也不到128個,所以在早期的電腦系統內,只用了0至127(即十六進制的00至7F)。 西文由於基本字符少,所以用2的8次冪就能包涵所有的字元。它的內碼集共0至255,名為ASCII。
但是中文字集龐大,擁有數萬字,8Bits 已經不敷使用,所以使用了 16Bits 固定長度的 Big5 編碼,不過 16Bits 也只頂多能表示 65535,還考慮相容於 ASCII,所以能用的字少很多,所以後來出現了 CCCII 以及 CNS11643 的中文編碼。 而最近也開始有人推 Unicode,這是準備包含所有字集的編碼。 在 UNIX 底下也就常會看到 zh_TW.Big5,在此,zh_TW 為中文字集, 而 Big5 為編碼。
目前 Big5 編碼的長度都是兩個 Byte,所以在本文中將會使用 00~FF 來代表一個 Byte,這是十六進位的表示法。所以,一個 Big5 編碼的字就會用 0000~FFFF 來表示,前兩個字十六進位代表高位元, 後兩個代表低位元。
在現行的系統下,在同一種環境中,只能顯示一種編碼, 所以只要這個編碼沒支援的字,就沒辦法顯示。
Big5 碼是 1984 年台灣資訊工業策進會根據《通用漢字標準交換碼》 制訂的編碼方案。(學長看到這個就說:原來 Big5 是資策會發展的呀,終於知道兇手是誰了。我看編碼系統發展的第一步就是把這種萬惡的機構先裁掉,再把該負責的人抓出來鞭數十,驅之別院....)
BIG5 碼系統為兩位元組之內碼系統,共可定義 19782 個字碼,其高、低位元組的範圍如下:
其第一位元組的值在 16 進制的 A1~FE 之間, 第二位元組在 40~7E 和 A1~FE 之間。因此,其第一位元組的最高位元是 1, 第二位元組的最高位元可能是 1,也可能是 0。
Big5 在上述範圍內,規劃出標準字(STDFONT)、特殊符號(SPCFONT、SPCFSUPP)及使用者造字(USRFONT)的區域,分別說明如下:
使用範圍 | 字數 | 保留範圍 | 字數 | |
標準字 常用字 | A440~C67E | 5401 | C6A1~C8FE | 408 |
標準字 次常用字 | C940~F9D5 | 7652 | ||
標準字 倚天字 | F9D6~F9FE | 41 | ||
SPCFONT 標準字 | A140~A3BF | 408 | ||
SPCFONT 控制碼 | A3C0~A3E0 | 33 | A3E1~A3FE | 30 |
SPCFSUPP 標準字 | C6A1~C8FE | 408 | ||
使用者造字 第一段 | FA40~FEFE | 785 | ||
使用者造字 第二段 | 8E40~A0FE | 2983 | ||
使用者造字 第三段 | 8140~8DFE | 2041 |
這是 Big5 編碼的規則之一。
中文字型筆劃順序內碼對照表 | |||||
筆劃 | 常用字區 | 次常用字區 | 筆劃 | 常用字區 | 次常用字區 |
01 | A440-A441 | 16 | BEA7-C074 | E8F4-ECB8、F9D9 | |
02 | A442-A453 | C940-C944 | 17 | C075-C24E | ECB9-EFB6 |
03 | A454-A47E | C945-C94C | 18 | C24F-C35E | EFB7-F1EA |
04 | A4A1-A4FD | C94D-C95C | 19 | C35F-C454 | F1EB-F3FC |
05 | A4FE-A5DF | C95D-C9AA | 20 | C455-C4D6 | F3FD-F5BF |
06 | A5E0-A6E9 | C9AB-C959 | 21 | C3D7-C56A | F5C0-F6D5 |
07 | A6EA-A8C2 | CA5A-CBB0 | 22 | C56B-C5C7 | F6D6-F7CF |
08 | A8C3-AB44 | CBB1-CDDC | 23 | C5C8-C5C7 | F6D6-F7CF |
09 | AB45-ADBB | CDDD-D0C7、F9DA | 24 | C5F1-C654 | F8A5-F8ED |
10 | ADBC-B0AD | D0C8-D44A | 25 | C655-C664 | F8E9-F96A |
11 | B0AE-B3C2 | D44B-D850 | 26 | C665-C66B | F96B-F9A1 |
12 | B3C3-B6C3 | D851-DCB0、F9DB | 27 | C66C-C675 | F9A2-F9B9 |
13 | B6C4-B9AB | DCB1-E0EF、F9D6-F9D8 | 28 | C676-C67A | F9BA-F9C5 |
14 | B9AC-BBF4 | E0F0-E4E5 | 29 | C67B-C67E | F9C6-F9DC |
15 | BBF5-BEA6 | E4E6-E8F3、F9DC |
一個很嚴重的問題是,編碼區的 C6A1-C8FE 中的字符並非統一, 在不同的編碼中有不同的字符。
C6A1-C8FE 這一段的內容在 MicroSoft 的 CP950( Code Page 950 )中不存在, 在 的網站上與現行的 Big5_eten 並不相同。下圖是倚天系統下的日文編碼,與 Big5 內此區段的內容不一樣( 因找不 Big5 字碼表,故無法貼圖比對)。
倚天/國喬系統下的日文字型碼 |
以最常用的日文為例,在 Big5 中,C6A1-C6F7 為片假名, C6F8-C7B0 為平假名,但在 Big5_eten 中,C6E7-C77A 為平假名, C67B-C7F2 為片假名。我們目前常用的日文, 竟然與政府制定的日文編碼不同? 後來有人告訴我,Unicode 網站上的 Big5 是 MAC 在使用的 Big5。
這是最嚴重的問題,就算用滿 Big5 的編碼區,還沒辦法表示所有的中文字集。 這個問題只能期待更好的編碼方式來解決。
我寫了一隻 Perl 程式,列印了 A140~F9FE 之間的所有字元, 你可以用瀏覽器開起來看看你的 C6A1-C8FE 的顯示狀況。
程式:
列印出之字碼表:
參考資料:
根據通訊定則之規定,所有控制碼均須避開,控制碼的範圍是 0x00~0x20,以及 0x7F 均予避開,則 7bit 字碼集共有 128 - 33 - 1 = 94。這是 CCCII 與 CNS11643 的做法。 Big5 與 Big5e 則是避開 0x00~0x3F,0x7F,0xFF 等。
Big5 用兩個位元組表達一個中文字,編碼範圍是 [0x81~0xFE][0x40~0x7E、0xA1~0xFE],編碼空間大小為 (0xFE~0x81)*((0xFE~0xA1)+(0x7E~0x40)) = 0x8D*(0x5D+0x3E) = 0x8D*0x9B = 0x555F = 21855。
MicroSoft 發行了 CP950,為 Big5 加上 F9D6~F9FE。之後,倚天發行了倚天擴充字集( Big5_eten ),為 Big5 加上七個常用字 (碁粧裏墻恒銹嫺)(F9D6~F9DC) & 劃字符號( F9DE~F9FE,╔ ╦ ╗╠ ╬ ╣ ╚ ╩ ╝ ╒ ╤ ╕ ╞ ╪ ╡