UAO0.jpg

常看很多人對「Unicode 補完計畫」都有意見,不是大力推薦、就是極力反對;但不管贊成或是反對的人,真的都瞭解它的原理嗎?都瞭解它產生的背景為何嗎?知道罪魁禍首其實是微軟的 Code Page 950 嗎?


系統字元編碼 (ASCII、Code Page)

很久很久以前,美國人做出電腦時只考慮了歐洲語系,沒考慮到東方語系的問題,所以當時採用的國別 Code Page 方法,編碼只有 8 bit (1 byte),最多 255 個字。前面 127 個字元 (只用 7 bit) 是一些字母、符號和控制字元,相容 ASCII 標準;後面 127 個字元叫「高位元」(因為用到 8 bit),則是按 Code Page 而不同。預設的是 Code Page 437,裏面有西歐語言字母和表格框線的符號。


東亞語言雙字元系統編碼 (DBCS)

之後,東亞地區也有很多人在使用電腦了,不可能一直只用英文字,於是各國就開始發展各國語言的編碼系統。因東亞文字數量太多,就採用兩個 byte 來組成文字,理論上最多可有 65535 個字 (實際上當然不可能有這麼多,因為低位元部分要保留給英文字母和符號,第一碼只能用高位元,否則到時像「at」這樣普通的英文字都被會轉成文字)。各國都出了各自的編碼,台灣香港 BIG5、日本 SJIS、中國 GB、韓國 KS 等。

例如在 BIG5 裏面「特」字的編碼是 AF53,表示由十六進位的 AF、53 兩碼組成。AF (175) 是「»」、53 (83) 是「R」;在中文模式下,只要發現這兩個字元組合在一起,系統就會將之轉成「特」字。但就因這原理,故常有一些英文軟體畫面的框線在中文模式下變成亂碼 (eg. C4C4C4C4「────」 會變成「闡闡」)。

而在 SJIS 裏面,AF53 是「ッR」,在 GB 裏面是「瘲(的簡體)」也就是說,同樣的碼用不同的系統來看會是不同的字,除非該編碼內就有編入他國文字,否則無法同時顯示多個國家的文字。


BIG5

台灣在那時其實是「萬"碼"奔騰」,各公司都推出自己的中文編碼,沒有統一規範。後來資訊公會統一弄出了 BIG5 碼,使用到後來卻成了主流。當時 BIG5 編碼是非常急就章而推出的,選字根本就是依據教育部的常用字標準,所以很多字都沒被選入 (eg.堃、煊、喆) 但因變成主流,大家只好將就著用 (政府戶政、圖書管理等系統用不同的編碼,所以字數多很多)。


Unicode

後來有一群人/公司開始發展 Unicode,也就是將世界上主要的文字統一編碼,只要電腦支援該編碼、有相對應的字型,就可以看到所有文字。

它做出一個將世界上主要文字整理後按編號排列的列表,用 U+xxxx 來表示,原始是規劃使用兩個 byte,可編列 65535 個字,從 U+0000 ~ U+FFFF (這個範圍叫「Basic Multilingual Plane」),但之後發現 65535 個字似乎不太夠用 (其中光是東亞文字就佔掉 3/4) 於是又增加了十六倍的編號位置,從 U+010000 ~ U+1000FD,只是其中很多部分都是保留用或還在規劃用途中。 (詳細的 Unicode 編號表)

不過,前述的 U+xxxx 只是編號方式 (專用術語叫「codepoint」),實際的「編碼」有很多,目前常見的是 UTF-8UTF-16、UTF-32 幾種:


UTF-8:

這個編碼方式的特色就是針對不同種類的字元使用不同的 byte 數,其中最大優點為原 ASCII 的資訊 (即使用 1 byte 的) 不必轉換就可以繼續使用,增加不少便利性:

Unicode 範圍使用 byte 數 範例
字碼Unicode 編號UTF-8 編碼
U+0000 ~ U+007F1 byteGU+004747
U+0080 ~ U+07FF2 byteЯU+042F042F
U+0800 ~ U+FFFF3 byteU+FF20EFBCA0
U+010000 ~ U+10FFFF4 byte U+20000F0A08080


UTF16:

不像 UTF8 變動 byte 數,而是固定用 2 byte 對 U+0000 ~ U+FFFF 編碼 (但 U+010000 ~ U+10FFF 則用 4 byte 編碼)。目前為目前 Windows 等許多作業系統內部處理使用的編碼方式。分為好幾種排列方式:

排列方式編碼範例
Я  (U+042F)@  (U+FF20)Я@
UTF-16LE (UTF-16 Little-Endian)2F0420FF2F0420FF
UTF-16BE (UTF-16 Big-Endian)042FFF20042FFF20
UTF-16LE 含 BOM (Byte Order Mark)  FFFE2F0420FF
UTF-16BE 含 BOM
  FEFF042FFF20


UTF-32:

每個字元都固定用 4 byte 編碼:

排列方式編碼範例
Я  (U+042F)@  (U+FF20)Я@
UTF-32LE (UTF-16 Little-Endian)2F040000FF2000002F040000FF200000
UTF-32BE (UTF-16 Big-Endian)0000042F0000FF200000042F0000FF20
UTF-32LE 含 BOM (Byte Order Mark)  FFFE00002F040000FF200000
UTF-32BE 含 BOM
  0000FEFF0000042F0000FF20


其後,有人認為中文、日文、韓文、越南文中很多漢字其實都一樣或是差不多,所以推動 UnihanCJKV,以將編入 unicode 中的漢字數量縮減。



以上都是講古,重點開始了


倚天中文

'80、'90 年代初,佔市場比例最大的是「倚天」的中文系統,倚天當時在 BIG5 保留的「造字區」放了一些部首、符號、日文假名、俄文字母。在 DOS 時代很常被使用者用到,累積了不少用到那些字的文件資料。


萬惡的淵藪、一切問題的起源:微軟

時代繼續發展,萬惡的微軟推出 Windows,將正體中文編為 Code Page 950,但是卻沒把前述造字區中的日文、俄文字母以及某些符號收進去!一直到 Windows Vista 出了,除了新增了歐元符號以外,還是沒日文字,這就是今天發生這個問題的起源!話說微軟放了幾個造字區的符號進正體中文 Code Page 950,但就是日文假名、俄文字母不收。簡體中文 CodePage 936 甚至連日製漢字、常用正體字都弄進去了,Code Page 950 卻是啥都缺。

在 Win95/98/ME 時代,使用者大多是以匯入 eudc、font.24 等使用造字區的方式來解決。到了 Win NT 之後,系統都採用 unicode 做內部處理,如果應用軟體也使用 unicode,那當然沒有問題,但是對於一些仍用以前 DBCS 編碼的軟體,Windows 就使用 codepage 轉換方式:

UAO3.gif

如圖左邊部份。也就是:從 DBCS 軟體貼到 unicode 的軟體時,系統會做內碼切換,反之亦然。

但是,在繁體中文的 CP 950 中並沒有日文假名,當然更沒有日製漢字。所以中文 Windows 下,不支援 unicode 的軟體碰到此類未對應的 unicode 字元時轉換會出問題,變成「?」或「_」,若檔名就有這種字元時,則連該檔案都無法開 (漢字部份則拜 CJKV 所賜,大多可以直接轉換)。


CP 932 (日文)unicodeCP 950 (正體中文)
あ (82A0)<->あ (U+3042)->?


Unicode 補完計畫 (Unicode at Once)

Unicode 補完計畫」就是為了解決這問題而出現的 (當初它的名字叫「Big5 Extension」,意思就是擴充 BIG5 缺少的部分,結果改成現在名字後反而產生被人誤會的問題)。

它的做法:

UAO3.gif

如圖左邊部份。它修改「Unicode 對 Code Page 950 的轉換對照表」,使 Unicode 日文假名在非 Unicode 狀況下改去用原倚天的造字區編碼,甚至還增加對應 Unicode 日製漢字、簡體中文、特殊正體中文字 (也是用造字區)。


Unicode 補完計畫的問題點

由於對應的是 Code Page 950 沒有使用到的區域 (原 BIG5/倚天 的造字區),因此不支援 Unicode 軟體弄出來的字,在未裝 UAO 的電腦上看時會是空白,使用者若沒注意到這點而大量用不支援 Unicode 的軟體處理檔案,結果就會發生慘案:

UAO1.gif UAO2.gif

非 Unicode 軟體看到的是 BIG5 造字區的編碼、Unicode 軟體看到的 Unicode 造字區的編碼,但這兩者都要有裝 UAO 的電腦才能看到字。


目前不支援 Unicode 的軟體仍為數不少,或者用慣了的軟體不支援 Unicode、有支援的卻又功能不符合需求或用不慣。按人的惰性來看,只要還有這種情況,UAO 就仍會一直存在、就會有人去使用。畢竟在在東亞地區處理資訊,會用到日文的機會相當大,但微軟卻一直不將日文放入,也才會有 UAO 產生出來的契機。

如果真要使用 UAO,就必須時常注意軟體輸出的文字是否變成 BIG5 了,否則雖然自己電腦看得到,但傳出去在沒有 UAO 的電腦上看到的都是空白啊!

輸入字碼在有 UAO 的系統在無 UAO 的系統
支援 Unicode 的軟體不支援 Unicode 的軟體支援 Unicode 的軟體不支援 Unicode 的軟體
Unicode あ (U+3042)あ (U+3042)あ (C6E8)あ (U+3042)?
Unicode   (U+F6F8)あ (U+3042)あ (C6E8)  (U+F6F8)あ (C6E8)
BIG5 あ (C6E8)あ (U+3042)あ (C6E8)  (U+F6F8)あ (C6E8)
SJIS あ (82A0)あ (U+3042)あ (C6E8)
あ (82A0)
あ (U+3042)?

註:U+3042 才是 あ 的正式 Unicode 編碼
        U+F6F8 是位於 Unicode 的造字區,通常沒有字型會去對應,會顯示空白
        C6E8 是以前倚天的擴充字區裏面 あ 的編碼,即俗稱的「uao 日文」、「BIG5 日文」



參考資料:



arrow
arrow
    全站熱搜

    Wayne Su 發表在 痞客邦 留言(3) 人氣()