1.2.3知识点 · 课时
文字编码
理解 ASCII、GB2312、Unicode 等文字编码的演进,认识乱码的成因。
文字编码:让字符变成 0/1
上一节我们知道,计算机里所有数据都是二进制。那么字符(字母、数字、汉字)是怎么变成 0/1 的呢?靠的就是编码——给每个字符规定一个唯一的二进制编号。
文字编码的演进
计算机是美国人发明的,最初只考虑英文:
1. ASCII 码(1963 年)
- 用 7 位二进制(0~127)表示 128 个字符
- 包含:英文大小写字母、数字、标点、控制符
- 'A' = 65,'a' = 97,'0' = 48
2. 中文编码:GB2312 / GBK / GB18030
- 一个汉字需要更多位
- GB2312(1980):6763 个汉字,2 字节/字
- GBK(1995):21003 个汉字,含繁体
- GB18030(2000):国家强制标准,覆盖少数民族文字
3. Unicode:统一天下的编码
- 1991 年发起,目标是给全世界每个字符一个唯一编号
- UTF-8 是 Unicode 最常用的实现方式
- 英文 1 字节、中文通常 3 字节、emoji 4 字节
| 字符 | ASCII | GB2312 | UTF-8 |
|---|---|---|---|
| 'A' | 01000001(1 字节) | 01000001(1 字节) | 01000001(1 字节) |
| '中' | ❌ 不支持 | 11010110 11010000(2 字节) | 11100100 10111000 10101101(3 字节) |
| 😀 | ❌ | ❌ | 11110000 10011111 10011000 10000000(4 字节) |
为什么会乱码
打开网页看到"烫烫烫"或"锟斤拷"?这是编码不匹配:
- 文件用 UTF-8 存储,但用 GBK 解码(或反过来)
- 解决:统一使用 UTF-8
📱 项目案例·编码探秘
- 用手机浏览器打开任意网页 → 长按 → "查看源代码",找到
<meta charset="UTF-8"> - 在 Python 里试试(下章会学):
len('A'.encode()) = 1,len('中'.encode()) = 3
🤔 思考
- 为什么 emoji 比"中"字还多占 1 字节?
- 一条朋友圈 100 个汉字,用 UTF-8 大约占多少字节?合多少 KB?
📝 知识小结
- 文字编码:ASCII(英文)→ GB2312(中文)→ Unicode/UTF-8(统一)
- UTF-8 是变长编码:英文 1 字节,中文 3 字节,emoji 4 字节
- 乱码 = 编码与解码方式不匹配,统一用 UTF-8 即可避免