Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5376153
  • 博文数量: 1144
  • 博客积分: 11974
  • 博客等级: 上将
  • 技术积分: 12312
  • 用 户 组: 普通用户
  • 注册时间: 2005-04-13 20:06
文章存档

2017年(2)

2016年(14)

2015年(10)

2014年(28)

2013年(23)

2012年(29)

2011年(53)

2010年(86)

2009年(83)

2008年(43)

2007年(153)

2006年(575)

2005年(45)

分类: LINUX

2005-05-01 11:47:16

由 堃(方方土) 探討 Big5e 編碼

作者:statue ()

前言

  會寫這篇文章是因為想討論看看 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 編碼

背景

  Big5 碼是 1984 年台灣資訊工業策進會根據《通用漢字標準交換碼》 制訂的編碼方案。(學長看到這個就說:原來 Big5 是資策會發展的呀,終於知道兇手是誰了。我看編碼系統發展的第一步就是把這種萬惡的機構先裁掉,再把該負責的人抓出來鞭數十,驅之別院....)

編碼空間

  BIG5 碼系統為兩位元組之內碼系統,共可定義 19782 個字碼,其高、低位元組的範圍如下:

  • 高位元組 0x81~0xFE
  • 低位元組 0x40~0x7E、0xA1-0xFE

  其第一位元組的值在 16 進制的 A1~FE 之間, 第二位元組在 40~7E 和 A1~FE 之間。因此,其第一位元組的最高位元是 1, 第二位元組的最高位元可能是 1,也可能是 0。

  Big5 在上述範圍內,規劃出標準字(STDFONT)、特殊符號(SPCFONT、SPCFSUPP)及使用者造字(USRFONT)的區域,分別說明如下:

 使用範圍字數保留範圍字數
  標準字 常用字A440~C67E5401C6A1~C8FE408
  標準字 次常用字C940~F9D57652  
  標準字 倚天字F9D6~F9FE41  
  SPCFONT 標準字A140~A3BF408  
  SPCFONT 控制碼A3C0~A3E033A3E1~A3FE30
  SPCFSUPP 標準字C6A1~C8FE408  
  使用者造字 第一段FA40~FEFE785  
  使用者造字 第二段8E40~A0FE2983  
  使用者造字 第三段8140~8DFE2041  

筆劃對照表

這是 Big5 編碼的規則之一。

中文字型筆劃順序內碼對照表
筆劃常用字區次常用字區筆劃常用字區次常用字區
01A440-A441 16BEA7-C074E8F4-ECB8、F9D9
02A442-A453C940-C94417C075-C24EECB9-EFB6
03A454-A47EC945-C94C18C24F-C35EEFB7-F1EA
04A4A1-A4FDC94D-C95C19C35F-C454F1EB-F3FC
05A4FE-A5DFC95D-C9AA20C455-C4D6F3FD-F5BF
06A5E0-A6E9C9AB-C95921C3D7-C56AF5C0-F6D5
07A6EA-A8C2CA5A-CBB022C56B-C5C7F6D6-F7CF
08A8C3-AB44CBB1-CDDC23C5C8-C5C7F6D6-F7CF
09AB45-ADBBCDDD-D0C7、F9DA24C5F1-C654F8A5-F8ED
10ADBC-B0ADD0C8-D44A25C655-C664F8E9-F96A
11B0AE-B3C2D44B-D85026C665-C66BF96B-F9A1
12B3C3-B6C3D851-DCB0、F9DB27C66C-C675F9A2-F9B9
13B6C4-B9ABDCB1-E0EF、F9D6-F9D828C676-C67AF9BA-F9C5
14B9AC-BBF4E0F0-E4E529C67B-C67EF9C6-F9DC
15BBF5-BEA6E4E6-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

  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,╔ ╦ ╗╠ ╬ ╣ ╚ ╩ ╝ ╒ ╤ ╕ ╞ ╪ ╡

阅读(3035) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~