乱码从哪来:GBK、Big5 和 UTF-8
适合谁看:打开文件、网页、表格时遇到乱码,想知道原因和解决办法的人。
字符集和编码方式
- 字符集:收哪些字、每个字什么编号(如 Unicode、GB 18030);
- 编码方式:把编号变成字节存起来的规则(如 UTF-8、UTF-16、GBK)。
同一个「中」字,用 UTF-8 存是 3 个字节,用 GBK 存是 2 个字节。读的时候用错规则,就会得到乱码。
常见的中文编码
| 编码 | 范围 | 说明 |
|---|---|---|
| GB 2312 | 6763 个汉字 | 早期简体中文编码 |
| GBK | 两万多个汉字 | GB 2312 的扩展,Windows 简体中文系统长期默认使用 |
| GB 18030 | 全部 Unicode 字符 | 国家标准,兼容 GBK,见《GB 18030:中文编码的国家标准》 |
| Big5 | 繁体常用字 | 台湾、香港早期常用 |
| UTF-8 | 全部 Unicode 字符 | 网页和现代软件的事实标准 |
典型乱码现象
- 「锟斤拷」:一段文字曾经被替换成了替代字符「�」,再用 GBK 显示出来;原文已经丢失,无法还原;
- 「浣犲ソ」这类怪字:UTF-8 的文字被当成 GBK 读了,用正确的编码重新打开就能恢复;
- CSV 用 Excel 打开乱码:文件是 UTF-8 编码,Excel 按系统默认编码打开。可以在 Excel 中用「数据 → 从文本/CSV」导入并选择 UTF-8,或保存为带 BOM 的 UTF-8。
怎么避免
- 统一用 UTF-8:网页、数据库、接口、文件都用 UTF-8;
- 网页声明编码:
<meta charset="utf-8">写在<head>最前面; - 数据库用完整的 UTF-8:例如 MySQL 要用
utf8mb4,见《人名、地名里的生僻字:系统怎么做》; - 和老系统交换数据时:明确约定编码,需要中文国标编码时用 GB 18030 而不是 GBK,GBK 存不下扩展区的生僻字。
乱码和方框不是一回事
乱码是编码问题,换字体没用;方框是字体缺字,换字体就好。区别见《生僻字为什么打不出、显示不了》。
这篇文档对你有帮助吗?
谢谢你的反馈!