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 用來指代“本地語言編碼”的一種統稱。