2008年3月12日 星期三

[教學]Unicode 是用幾個位元來進行編碼?

2008-03-12 update:這篇有重新改寫過。

這篇想寫很久了………

94學年度四技二專統一入學測驗的計算機概論有一考題:

Unicode 是用幾個位元來進行編碼? (A)8 (B)16 (C)24 (D)32

當年的標準答案是 (B)16 位元。這題考古題至今仍被各大高職教科書出版社收錄在計算機概論的參考書、測驗卷、模擬試裡。其中一家對此題的說明是:

ASCII 碼使用 8 位元編碼、 BIG-5 碼與 Unicode 都是使用 16 位元編碼。

後來發現,一些高職計算機概論教科書也都是這般寫。

拜託,別再害人了。

這個題目本身存在著一個絕對錯誤的假設「 Unicode 是一種編碼方式」。而實際上,「 Unicode 只是一種編碼的概念」。有關 Unicode 的說明,除了 www.unicode.org 網站的官方說明之外,我以前也貼過一篇周思博的 每個軟體開發者都絕對一定要會的Unicode及字元集必備知識(沒有藉口!) 的連結。強列建議搞不清楚 Unicode 、 UTF-8 …這些術語的人好好看一看。我整理一些重點如下:

  • Unicode 是一種編碼概念,希望將全世界所有的文字符號在任何系統之一都使用統一的編碼,解決資訊跨平台的問題。
  • 現行 Unicode 使用的編碼空間 ( code space ) 為 0~10FFFF(16) 。由這點看, Unicode 就不是 16 bits 。而 code space 也只是一種概念,不是編碼方式。
  • Unicode 的編碼有各種不同的實作方式,或稱字元編碼方式 ( Unicode Encoding Forms ) ,不同編碼方式儲存文字使用的記憶容量是不同的。
  • Unicode 標準支援三種字元編碼方式: UTF-8 、 UTF-16 、 UTF-32 。
  • UTF-8 使用 1 至 6 個位元組 ( 8 ~ 48 bits ) 儲存一個文字。
  • UTF-8 英文部份使用 1 位元組儲存 1 個字元,與 ASCII 碼的 1 - 127 相容,這也使得 UTF-8 成為目前最受歡迎的 Unicode 編碼方式。
  • UTF-8 在中 ( 包含簡中與繁中 ) 日韓語言上使用 3 個位元組儲存一個文字。
  • UTF-16 使用 2 個位元組編碼常用的 63000 多個字,包括英文。因為 UTF-16 比現在最受歡迎的 UTF-8 早出來,或許這是國內一些計概教科書關於 Unicode 使用 2 Bytes 的由來吧。
  • UTF-16 當然不是只能編 63000 多個字,它還使用 4 Bytes 編碼 1 百多萬個不常用字,這部份稱為 surrogates。
  • UTF-16 的 surrogates 是由兩組 16 bits 的碼組成,第一組的範圍為 D800(16)~DBFF(16) ,第二組的範圍為 DC00(16)~DFFF(16) ,也就是說符合前述的連續 4 Bytes 會被視為 1 個 UTF-16 裡的次常用字。
  • 所以,若單論 UTF-16 ,一個字元是使用了 2~4 Bytes
  • UTF-32 每個文字使用 4 個位元組。
  • 因為文字編碼架構 ( Unicode Encoding Schemes ,我理解為字元編碼儲存方式的實作 ) 不同, UTF-16 與 UTF-32 又分為 UTF-16LE 、 UTF-16BE 、 UTF-32LE 、 UTF-32BE 。
  • 為了讓作業系統、應用程式分辨 UTF-16LE 、 UTF-16BE 、 UTF-32LE 、 UTF-32BE ,必需要在文件的開頭加上 2 位元組的 BOM ( Byte Order Mark ) 。
  • UTF-8 不需要 BOM ,但是一些文字編輯程式會一律替 Unicode 文件加上 BOM ,其中最有名的就是 Windows 的記事本程式。
  • BOM 會造成許多 PHP 程式執行發生錯誤。

以上資料,主要參考 Unicode.org ,尤其很多東西在這篇 FAQ 裡就說明的很清楚了,不是什麼難查的東西。

四技二專的學測,很多科系計算機概論都是必考的專業課程,在考試領導教學的今天,加上曾是學測的考古題,又不見技職院校在更正,國立編譯館在高職計概教科書的把關上似乎也蠻寬鬆的,不知道國內的計概教科書什麼時候才會更正?

2 則留言: