### **什么是 UTF-8?**
UTF-8(**Unicode Transformation Format - 8-bit**)是一种 **可变长度的字符编码**,用于**兼容 [[ASCII]] 并支持全世界的所有字符**。它是目前**互联网上最常用的字符编码**。
---
## **1. UTF-8 解决了什么问题?**
**ASCII** 只能表示 **128 个字符**(英文字母、数字、基本符号),无法表示中文、日文、韩文、阿拉伯文等非拉丁字符。
为了解决这个问题,**Unicode** 标准出现了,理论上可以为**世界上所有字符分配一个唯一的数值(码点)**,但问题是:
- **Unicode 直接使用 16 位或 32 位存储字符,导致文件变大**(比如 `A` 原本 ASCII 只要 1 字节,Unicode 却可能用 2 字节)。
- **与 ASCII 不兼容**,老系统和 ASCII 兼容性差。
**UTF-8 就是 Unicode 的一种编码方式,既支持所有字符,又能保证与 ASCII 兼容。**
---
## **2. UTF-8 的工作方式**
UTF-8 是**可变长编码**,根据字符的不同,**使用 1~4 个字节表示**:
- **ASCII 兼容性**:0~127 的 ASCII 字符只占 **1 字节**(和 ASCII 完全一样)。
- **拉丁文扩展字符(欧洲语言)**:需要 **2 字节**。
- **汉字、日文、韩文**:需要 **3 字节**。
- **特殊字符和Emoji**:可能需要 **4 字节**。
**示例:**
|字符|Unicode 码点|UTF-8 编码(十六进制)|UTF-8 字节数|
|---|---|---|---|
|A|U+0041|`41`|1 字节|
|é|U+00E9|`C3 A9`|2 字节|
|中|U+4E2D|`E4 B8 AD`|3 字节|
|😃|U+1F603|`F0 9F 98 83`|4 字节|
---
## **3. UTF-8 为什么重要?**
✅ **兼容 ASCII**,所有 ASCII 文件直接当作 UTF-8 读取不会出错。
✅ **节省空间**,常见字符用 1~3 字节,而不是固定 2 或 4 字节。
✅ **全球通用**,支持 **中文、阿拉伯文、俄文、Emoji 等所有语言**。
✅ **成为互联网标准**,所有网页、JSON、XML 默认都使用 UTF-8。
---
## **4. UTF-8 如何区分字符长度?**
UTF-8 采用 **首字节标识长度**,然后后续字节带上 `10` 前缀:
|UTF-8 字节数|编码范围|二进制格式|
|---|---|---|
|1 字节|0x00 - 0x7F|`0xxxxxxx`|
|2 字节|0x80 - 0x7FF|`110xxxxx 10xxxxxx`|
|3 字节|0x800 - 0xFFFF|`1110xxxx 10xxxxxx 10xxxxxx`|
|4 字节|0x10000 - 0x10FFFF|`11110xxx 10xxxxxx 10xxxxxx 10xxxxxx`|
示例:
- `A`(U+0041):**1 字节**,`01000001`
- `é`(U+00E9):**2 字节**,`11000011 10101001`
- `中`(U+4E2D):**3 字节**,`11100100 10111000 10101101`
- `😃`(U+1F603):**4 字节**,`11110000 10011111 10011000 10000011`
这样,**解码时计算机可以判断字符是 1、2、3 还是 4 字节,无需额外标记!**
---
## **5. UTF-8 和其他编码的对比**
|编码方式|字节数|兼容 ASCII|适合哪些情况|
|---|---|---|---|
|ASCII|1 字节|✅|仅限英语和基本符号|
|UTF-8|1-4 字节|✅|适合全球所有语言,网页、数据库|
|UTF-16|2-4 字节|❌|适合大量亚洲字符(但不如 UTF-8)|
|UTF-32|4 字节|❌|适合极端高效的 Unicode 处理(很少用)|
---
## **6. 什么时候使用 UTF-8?**
✅ **几乎所有情况下都推荐使用 UTF-8**,除非你有特殊需求,比如:
- **网页和 HTML 文件**:现代浏览器默认 UTF-8。
- **数据库(MySQL、PostgreSQL)**:存储多语言数据时,推荐 `utf8mb4`。
- **JSON / XML / CSV**:跨平台数据存储,UTF-8 最通用。
- **编程语言(Python、JavaScript、Java 等)**:字符串默认 UTF-8 编码。
---
## **7. 总结**
1. **UTF-8 是 Unicode 的一种编码方式**,用于表示**全球所有字符**。
2. **可变长编码(1~4 字节)**:
- **ASCII 兼容**(0~127 只占 1 字节)。
- **其他字符**使用 2-4 字节存储。
3. **互联网和跨平台应用最广泛的编码**,网页、API、数据库默认使用 UTF-8。
4. **节省存储空间**,比 UTF-16/UTF-32 更高效。
---
### **简单记住 UTF-8**
✔ **兼容 ASCII**(所有 ASCII 文件就是合法的 UTF-8)。
✔ **1~4 字节可变长编码**(节省存储空间)。
✔ **全球通用,支持所有语言**(中文、日文、韩文、Emoji)。
✔ **互联网标准**(网页、数据库、API 默认使用 UTF-8)。