
### 1. 为什么需要字符编码？

计算机底层只能存储和处理 **二进制（0 和 1）**。  
文字、符号、表情等人类能看懂的内容，必须先转换成二进制数字才能被计算机存储和传输。这个“文字 → 二进制”的转换规则，就叫做 **字符编码（Character Encoding）**。

---

### 2. ASCII 码（American Standard Code for Information Interchange）

**诞生时间**：1963 年  
**设计目的**：最早的标准化字符编码，主要用于英语。

#### 特点：
- **7位** 二进制数表示一个字符（理论上可表示 128 个字符）
- 实际常用 **8位（1字节）**，最高位通常为 0
- 总共定义了 **128 个字符**（0~127）

#### 包含内容：
- 0~31：控制字符（如换行 `\n`、回车 `\r`、制表符 `\t` 等）
- 32~126：可打印字符
  - 数字 0-9
  - 大小写英文字母 A-Z、a-z
  - 常用标点符号（如 ! " # $ % & ' ( ) * + , - . / 等）
- 127：删除字符（DEL）

#### 优点：
- 简单、节省空间、兼容性极强

#### 缺点：
- **只能表示英文**，完全不支持中文、日文、韩文、阿拉伯文等其他语言。
- 128 个字符远远不够。

**示例**：
- `'A'` → ASCII 65 → 二进制 `01000001`
- `'a'` → ASCII 97 → 二进制 `01100001`
- 空格 → ASCII 32

---

### 3. Unicode（统一码 / 万国码）

**诞生背景**：为了解决 ASCII 只能表示英文的问题，统一全球所有文字。

**核心理念**：
- 为世界上**几乎所有字符**分配一个唯一的数字编号，这个编号叫做 **码点（Code Point）**。
- 码点通常用 `U+` + 十六进制表示，例如：
  - `U+0041` = 'A'
  - `U+4E2D` = '中'
  - `U+1F600` = 😀（笑脸表情）

#### Unicode 的规模：
- 目前（2026年）已经包含超过 **15万个字符**
- 覆盖：现代文字、古文字、数学符号、表情符号、音乐符号、emoji 等几乎所有人类使用的符号。

**重要概念**：
- **码点（Code Point）**：字符的唯一编号（如 U+4E2D）
- **字符平面（Plane）**：Unicode 把码点分成 17 个平面，每个平面有 65536 个码点。
  - 平面 0（Basic Multilingual Plane，BMP）：最常用的字符（包括中文、日文、韩文等）
  - 平面 1 及以上：表情、古文字等不常用字符

**Unicode 只是一个字符集（Character Set）**，它**不负责**如何把码点存储成二进制字节。

---

### 4. UTF-8（Unicode Transformation Format - 8-bit）

**最重要的事实**：
> **UTF-8 是目前互联网上使用最广泛的 Unicode 编码方式**（全球网页编码占比超过 95%）。

#### 设计目标：
- 兼容 ASCII
- 可变长度编码，节省空间
- 能表示所有 Unicode 字符

#### 编码规则（核心）：

| 字符范围（码点）          | 字节长度 | 说明                          |
|---------------------------|----------|-------------------------------|
| U+0000 ~ U+007F（ASCII） | 1 字节   | 与 ASCII **完全兼容**         |
| U+0080 ~ U+07FF           | 2 字节   | 包含大部分扩展拉丁文等        |
| U+0800 ~ U+FFFF           | 3 字节   | **包含所有常用中文、日文、韩文** |
| U+10000 ~ U+10FFFF        | 4 字节   | 罕用字符、表情符号等          |

#### 实际例子对比：

| 字符 | Unicode 码点   | ASCII | UTF-8（十六进制）     | 占用字节 |
|------|----------------|-------|-----------------------|----------|
| A    | U+0041         | 65    | `41`                  | 1        |
| é    | U+00E9         | -     | `C3 A9`               | 2        |
| 中   | U+4E2D         | -     | `E4 B8 AD`            | 3        |
| 😀   | U+1F600        | -     | `F0 9F 98 80`         | 4        |

**UTF-8 的优点**：
1. **完全兼容 ASCII**：纯英文文本用 UTF-8 和 ASCII 字节完全一样
2. **可变长度**：常用字符（尤其是英文）占用空间少
3. **自同步**：可以从任意字节开始快速找到字符边界（容错性好）
4. **全球通用**：互联网事实标准

**缺点**：
- 中文等字符固定占用 3 字节，比固定长度的 UTF-16 要多占用一点空间（但通常可以接受）

---

### 5. 常见编码方式对比总结

| 编码方式     | 字节长度     | 兼容ASCII | 支持中文 | 互联网使用率 | 备注                     |
|--------------|--------------|-----------|----------|--------------|--------------------------|
| **ASCII**    | 1 字节       | 是        | 不支持   | 极低         | 仅英文                   |
| **GB2312/GBK** | 1~2 字节   | 部分      | 支持     | 中国国内老系统 | 仅支持中文               |
| **UTF-16**   | 2 或 4 字节  | 否        | 支持     | 中等         | Windows 内部常用         |
| **UTF-32**   | 固定 4 字节  | 否        | 支持     | 极低         | 浪费空间，几乎不用       |
| **UTF-8**    | 1~4 字节     | **完全**  | 支持     | **最高**     | **强烈推荐**             |

---

### 6. 实际开发中应该怎么做？

**最佳实践**：
- **所有新项目一律使用 UTF-8**
- 保存文件时选择 UTF-8 编码（尤其是包含中文的文件）
- 数据库：字符集设置为 `utf8mb4`（MySQL 中支持最多字符的 UTF-8）
- Web 页面：`<meta charset="UTF-8">`
- Python 3、JavaScript、Java、Go 等现代语言默认就是 UTF-8 或对 UTF-8 支持极好

**常见问题**：
- **乱码**：通常是因为编码和解码时使用了不同的规则（如文件保存为 GBK，却用 UTF-8 打开）
- **Emoji 显示异常**：因为用了不支持 4 字节字符的 `utf8` 而不是 `utf8mb4`

---

### 7. 一句话总结

- **ASCII**：老古董，只能表示英文，1 字节。
- **Unicode**：给全世界所有字符发了一个“身份证号码”（码点），但它不负责存储。
- **UTF-8**：目前最好的“存储方式”，聪明地用 1~4 字节表示所有 Unicode 字符，兼容 ASCII，是互联网的统一语言。

---

**推荐记忆口诀**：
> “ASCII 是基础，Unicode 是身份证，UTF-8 是最聪明、最通用的存身份证方式。”

