資料表示法與數字系統

字元編碼(ASCII 與 Unicode)

/ ASCII = ASS-kee /

電腦只儲存數,所以要存文字,每個字元都必須被指派一個數——一個代碼。字元編碼就是那本大家約定好的字典,把每個字母、數字、符號對應到一個特定的數(並能對應回來)。它就像一本密碼本,'A' 代表 65、'B' 代表 66,依此類推;只要書寫者與閱讀者用同一本密碼本,文字就能完整地穿過這台「只有數」的機器。

最早被廣泛使用的密碼本是 ASCII,它把數 0 到 127 指派給英文字母、數字、標點與少數控制碼,每個字元塞進 7 個位元(一個位元組還有餘)。所以 'A' 是 65(0x41)、'a' 是 97(0x61)。ASCII 對英文運作極佳,卻沒有空間容納重音字母、中文、阿拉伯文、表情符號,或世界使用的其他成千上萬個字元。Unicode 解決了這點,它給基本上每一種書寫系統裡的每一個字元一個獨一無二的數,稱為碼點(code point)——可能超過一百萬個,'A' 是 U+0041、中文字「中」是 U+4E2D。Unicode 是「哪個字元拿哪個數」的龐大目錄;它本身並不說明如何把那些數存成位元組。

存成位元組這件工作屬於編碼形式,而主流的是 UTF-8。UTF-8 很聰明:它對原本的 ASCII 字元用單一位元組(所以任何純英文文字自動就是合法的 UTF-8),對其他一切用兩、三或四個位元組。這種向後相容正是 UTF-8 接管網路的原因。誠實的陷阱真實又常見:一個字元不再永遠是一個位元組,所以數位元組不等於數字元;而如果文字用一種編碼寫、卻用另一種編碼讀,你會得到亂碼(mojibake)——本該是可讀文字的地方變成一堆亂七八糟的符號。永遠知道並匹配你文字的編碼,是個真實而反覆出現的 bug 來源。

在 ASCII 裡,'A' 是 65(0x41)、'a' 是 97(0x61)。在 Unicode 裡,中文字「中」是碼點 U+4E2D,UTF-8 把它存成三個位元組 0xE4 0xB8 0xAD——所以那一個字元是一個碼點、卻是三個位元組。

ASCII 用一個位元組涵蓋英文;Unicode 為每個字元命名;UTF-8 用 1 到 4 個位元組儲存它們。

在 UTF-8 裡一個字元不一定是一個位元組,所以位元組數不等於字元數。用錯誤編碼讀文字會產生亂碼——這是個常見而真實的 bug 來源。

又称
ASCIIUnicodeUTF-8字元集文字編碼