1.什麼是字符集

字符集是內容的集合。它的核心任務是做兩件事:

  • 收錄:決定包含哪些文字(是隻收英文?還是收中文、阿拉伯文、表情符號?)。
  • 編號:給每個文字發一個唯一的編號(學術上叫碼點)。

2.什麼是編碼規則

編碼規則是形式的規範。計算機只認識 0 和 1(二進制),它需要知道怎麼把上面那個編號轉換成二進制流來存硬盤或傳網絡。 同一個字符集,可以有不同的編碼規則。最典型的例子就是 Unicode: UTF-8:一種“變長”的打包方式。 UTF-16:另一種“變長”的打包方式。 UTF-32:一種“定長”的打包方式。

3.UTF-8是怎麼編碼的

UTF-8 規定,根據碼點數值的大小(二進制位數),來決定使用幾個字節來存儲。這是 UTF-8 最核心的規則表:

Unicode 碼點範圍(十六進制) 二進制位數 UTF-8 編碼格式(字節數)
U+0000 - U+007F 7位 0xxxxxxx (1字節)
U+0080 - U+07FF 11位 110xxxxx 10xxxxxx (2字節)
U+0800 - U+FFFF 16位 1110xxxx 10xxxxxx 10xxxxxx (3字節)
U+10000 - U+10FFFF 21位 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx (4字節)

示例:“嚴”字unicode字符編碼U+4E25,換算成二進制是 100111000100101,需要使用 3 個字節來表示,將二進制100111000100101填到3字節的佔位符xxx中,從後向前填寫,不足的位置填0。再轉換成十六進制就是 E4 B8 A5

4.對比ASCII/UNICODE/GBK/UTF8

名稱 核心身份 字符範圍 存儲方式(編碼特點) 備註
ASCII 字符集+編碼 僅英文、數字、符號 固定 1 字節 最基礎的標準
GBK 字符集+編碼 中文(簡/繁)、日韓 變長:英文1字節,中文2字節 國內舊系統常用
Unicode 字符集 所有語言、符號 不規定存儲 只負責分配碼點(如 U+6C49)
UTF-8 編碼規則 所有語言(基於Unicode) 變長:1 ~ 4 字節 互聯網標準,兼容 ASCII

注意:unicode只是字符集,需要配合UTF-X一起使用。

5.對比GB2312/GBK/GB18030

特性 GB2312 (1981) GBK (1995) GB18030 (現行國標,2000/2005/2022修訂)
全稱 信息交換用漢字編碼字符集 漢字內碼擴展規範 信息技術 中文編碼字符集
收錄漢字數 約 6,763 個 約 21,003 個 約 70,244 個
包含字符 常用簡體漢字、標點、符號 包含 GB2312 + 繁體字 + 生僻字 包含 GBK + 少數民族文字 + 更多生僻字/emoji
編碼方式 1 字節 或 2 字節 1 字節 或 2 字節 1 字節、2 字節 或 4 字節
ASCII 兼容區(1字節) 0x00 - 0x7F (單字節,直接兼容 ASCII) 0x00 - 0x7F (單字節,直接兼容 ASCII) 0x00 - 0x7F (單字節,直接兼容 ASCII)
漢字/符號區(2字節) 0xA1A1 - 0xF7FE (雙字節,且每個字節最高位均為1) 0x8140 - 0xFEFE (雙字節,首字節 0x81-0xFE,尾字節 0x40-0xFE,剔除 0x7F) 0x8140 - 0xFEFE (雙字節,與 GBK 完全兼容)
擴展區 (4字節) 不支持 不支持 (首字節)(2字節)(3字節)(4字節) 格式:81-Fe 30-39 81-Fe 30-39
兼容性 基礎 兼容 GB2312 兼容 GB2312 和 GBK
地位 早期標準,現已過時 事實標準(非正式國標),曾廣泛使用 強制性國家標準(現行)

6.什麼是ANSI

ANSI 既不是固定的字符集,也不是固定的編碼規則。 在計算機(特別是 Windows 操作系統)的語境下,ANSI 指的是“系統默認的本地化編碼”。

  • 它的含義是動態的:
    • 在簡體中文版 Windows 中,ANSI 指的是 GBK 編碼。
    • 在繁體中文版 Windows 中,ANSI 指的是 Big5 編碼。
    • 在英文版 Windows 中,ANSI 指的是 ASCII 或 ISO-8859-1。
    • 在日文版 Windows 中,ANSI 指的是 Shift-JIS。
  • 為什麼會有 ANSI 這個概念? 早期的 Windows 記事本等程序,在保存文件時有一個“ANSI”選項。它的意思是:“別用 Unicode,就用我這個系統默認的、能顯示本國語言的編碼來存”。所以,當你把一個 ANSI 編碼的文件從中文 Windows 發給日文 Windows 時,因為雙方對“ANSI”的理解不同,就會看到亂碼。 總結: ANSI 是 Windows 用來指代“本地語言編碼”的一種統稱。