Sean's Note: ASCII、ANSI、Unicode、UTF-8 的差別

2013年6月26日 星期三

ASCII、ANSI、Unicode、UTF-8 的差別

SBCS (Single Byte Character Set)

  • ASCII
    ASCII 是美國於 1967 年發表的一套電腦編碼系統,主要將 26 個英文字母用 1 個 byte 來表示。加上數字與其他的字元符號,總共有 128 個字元,後來又衍生了有 256 個字元的 extended ASCII  (詳見: ASCII Table)。
  • ANSI
    ANSI 是 American National Standards Institute 的縮寫。內容就是 ISO 8859/x 加上額外的字元,也是用 1 個 byte 來表示,比起 ASCII 少了一些控制字元,卻多了一些重音字元 (accented characters) (詳見: ANSI Table)。

MBCS (Multi-Bytes Character Set)

  • 在 Window 系統裡,根據不同語言的系統有不同的預設值,可到 "控制台" -> "地區及語言" -> "系統管理" -> "非 Unicode 程式的語言" -> "變更系統地區設定..." 做更改。例如選擇 "中文 (繁體,台灣)" 時,使用的是 Big5 編碼; "中文 (簡體,中國)" 是用 GB2312 編碼;"日文 (日本)" 則是 Shift-JIS 編碼。

    (詳見: Code Page Identifiers)

    為什麼會有這些額外的編碼? 當然是因為早先的 ASCII 只定義了英文字母,可是其他國家也 想要用電腦啊! 而且每個國家有各自的文字,於是各自發展了以 ASCII 衍伸的編碼,用 128 之後來開始定義自己的文字。

    附註:在程式語言裡的 ANSI String 、ATL 的 macro A2W 和 W2A 指的是 ANSI/MBCS 兩者的集合。 

Wide Character 

  • Unicode
    原全名為 Universal Multiple-Octet Coded Character Set,又稱我們熟知的 Unicode 萬國碼。原先一個國家一套編碼,會造成用日文編碼的程式無法正確在中文系統上顯示,為了解決這樣的問題,Unicode 就自然的誕生了。Unicode 用 2 個 bytes 來表示所有國家的字母及字元  (可表示 65535 個字), 而原先的 ASCII 碼與 Unicode 的表示仍然相同,只是 Unicode 多用了一倍的記憶體空間。
  • UTF-8 (8-bit Unicode Transformation Format)
    是一種針對 Unicode 的可變長度字元編碼,以 1~3 個 bytes 來表示一個字元,如此大大的減少了記憶體空間的使用量,便於在網路上更有效率的傳輸。
    這是一個 Unicode 與 UTF-8 的轉換表:

UnicodeUTF-8
0000 - 007F0xxxxxxx
0080 - 07FF110xxxxx 10xxxxxx 
0800 - FFFF
1110xxxx 10xxxxxx 10xxxxxx

用一個簡單的例子來說明如何轉換,"我" 的 Unicode 是 6211,座落於表中的第三列,以二 進位表示即 0110 0010 0001 0001,依序從後面補置表中的 x 處,得到
11100110 10001000 10010001,再轉成十六進位, E6 88 91 即是 "我" 的 UTF-8 編碼。

沒有留言:

張貼留言