字符编码与中文乱码速查
Unicode、UTF-8、GBK 到底谁是谁,中文乱码为什么会出现、能不能修复,BOM 什么时候该加——按「编码→解码」这条线一次讲清。
中文乱码几乎是每个人都遇到过的问题,但它其实一点都不神秘:只要「写的时候用编码 A,读的时候用编码 B」,就必然乱码。所以乱码排查永远只有两个问题——数据是什么编码,读取端按什么编码解。
在动手排查之前,先把几个常被混为一谈的名词理清:Unicode 是字符集(给每个字符编号),UTF-8 是编码方式(把编号存成字节),而 GBK 比较特殊——它既是字符集也是编码。下面先从这组概念开始,然后是乱码的具体分类与修复顺序。
1六个必须分清的名词
最容易出错的一点是把「字符集」和「编码」当成一回事。字符集回答「有哪些字符、每个编号是多少」,编码回答「这些编号在文件里怎么存成字节」。同一个字符集可以有多种编码方式。
| 名称 | 是什么 | 范围 / 特点 |
|---|---|---|
| ASCII | 字符集 + 编码 | 0 到 127,英文与基本符号,单字节。是后面所有编码的基础 |
| ISO-8859-1 | 单字节编码 | 扩展了西欧字符。常被误当成「万能解码器」,用它解码 UTF-8 会得到一串拉丁怪字 |
| GB2312 | 中文编码 | 1980 年代标准,收录约 6763 个常用汉字 |
| GBK | 中文编码 | GB2312 的扩展,收录 2 万余汉字,完全兼容 GB2312 |
| Unicode | 字符集(不是编码) | 为全世界字符统一编号,如「中」的码点是 U+4E2D |
| UTF-8 | Unicode 的编码方式 | 变长,1 到 4 字节。中文通常占 3 字节,是互联网事实标准 |
| UTF-16 | Unicode 的编码方式 | 变长 2 或 4 字节,Windows 内部与 Java 字符串使用 |
| GB18030 | 中文编码(强制国标) | 向下兼容 GBK,覆盖全部 Unicode 字符,是国内的强制性标准 |
记忆抓手:Unicode 负责「编号」,UTF-8 负责「存字节」。中文里说「转成 UTF-8」,严格讲是「按 UTF-8 编码存」;而 GBK 既是编号表也是存储方式,所以能直接说「这个文件是 GBK」。
2五类乱码现象与成因
乱码的样子不同,成因和可修复性也完全不同。识别出属于哪一类,就知道该怎么处理——尤其是后两类,基本已经无法完整还原。
| 现象 | 成因 | 能否修复 |
|---|---|---|
像 文件 这样的拉丁怪字 | UTF-8 字节被按 ISO-8859-1 解码 | 能。按 UTF-8 重新解码即可 |
像 鏂囦欢 这样的汉字怪字 | UTF-8 字节被按 GBK 解码 | 能。按 UTF-8 重新解码即可 |
像 Îļþ 这样的符号怪字 | GBK 字节被按 ISO-8859-1 解码 | 能。按 GBK 重新解码即可 |
一串 ? 或方块 | 目标编码里没有这个字符,转换时被替换掉了 | 不能。原始信息已经丢失 |
锟斤拷 | 替换字符(U+FFFD)又被按 GBK 编码了一次 | 不能。这是已经过两手损坏的结果 |
显示为 口口口 的空心方块 | 字体缺少对应字形(编码其实是对的) | 装字体即可,不是编码问题 |
判断技巧:看到拉丁字母和符号混杂的乱码,通常是「UTF-8 被当单字节编码读」;看到成片的汉字但明显不是正常词句,通常是「UTF-8 被当 GBK 读」。两种都能救回来。
3乱码排查的固定顺序
乱码问题的难处不在技术,而在于环节多——文件、网络传输、数据库、程序内存,每一层都可能发生一次编码转换。按下面的顺序查,基本不会漏。
- 第一步:确认源编码
- 先弄清数据「本来」是什么编码,看导出工具的设置、看原始文件的声明,不要靠猜。猜错编码,后面的修复只会越修越乱
- 第二步:确认读取端
- 看读取方按什么编码解码——网页看 meta charset 与响应头,程序看打开文件时的参数,数据库看连接串
- 第三步:两端对齐
- 两边一致就不会乱码。这是唯一正确的长期方案,任何「用另一个错误去抵消前一个错误」的做法都会在某个环节再次崩掉
- 第四步:抢救已有数据
- 如果存的已经是乱码,做法是「按错误编码取回原始字节,再按正确编码重新解码」。例如 UTF-8 内容被存成了 ISO-8859-1,就用 ISO-8859-1 读出来再按 UTF-8 重新解析
- 网页场景
- 依次检查:文件实际编码 → meta charset → 响应头 Content-Type 里的 charset → 数据库字段字符集,四处一致才不会乱
- 数据库场景
- 连接串 characterEncoding、表字符集、字段字符集三处都要统一。MySQL 建议全程用 utf8mb4(utf8 三字节版本存不下 emoji)
4BOM:什么时候该加,什么时候不能加
BOM(字节顺序标记)是文件开头的一小段字节。UTF-8 的 BOM 是 EF BB BF 三个字节,作用相当于「本文件是 UTF-8」的显式声明。它有两个完全相反的适用场景。
- 不能加:网页与代码文件
- BOM 会被当成正文内容,导致页面顶部出现多余空白、PHP 无法再发送响应头(因为已经输出了内容),某些解析器还会把它当成第一个字符而导致语法错误
- 应该加:给 Excel 打开的 CSV
- Excel 打开 UTF-8 的 CSV 默认按本地编码解释,中文会乱码。加上 BOM 后 Excel 能正确识别为 UTF-8——这是「CSV 中文乱码」最常见的解法
- 辨析
- 「CSV 乱码」有两种:一种是内容真的坏了(可修复),另一种是内容没错、只是 Excel 解码方式不对(加 BOM 或改用「导入数据」功能指定编码即可)
- 其他场景
- JSON 规范不推荐加 BOM;XML 解析器允许 BOM;纯文本文件按需处理,交接给 Windows 系统时可保留
5实用结论:默认一切都是 UTF-8
除了必须对接遗留系统(老政务平台、老版 ERP、部分银行接口)的情况,现代开发没有理由不用 UTF-8。下面是几处「容易忘记显式声明」的地方,漏掉任何一处都可能冒出一个乱码。
- HTTP 响应头
- Content-Type: text/html; charset=utf-8
- HTML 文档
- meta charset 放在 head 的最前面,且必须与文件实际编码一致
- 文件读写
- 打开文件时显式指定 encoding="utf-8",不要依赖操作系统默认值
- 数据库
- 建库、建表、连接串三处统一 utf8mb4
- 数据导入导出
- CSV / TXT 导出时指定编码,给 Excel 用就加 BOM
- 邮件
- MIME 头里的 charset 参数,缺失会导致中文主题乱码
看完就能用的站内工具
全部工具总览 →中文、表情符号等字符与Unicode转义序列(\u或U+格式)双向转换。
在线完成中文与 UTF-8 十六进制、Unicode 转义、URL 百分号编码之间的互转,解决乱码与转义问题,纯浏览器本地处理
HTML实体编码解码工具,将特殊字符转为&name;或&#nnn;格式,支持命名实体、数值实体编码与解码,纯浏览器本地运行。
URL编码 - URL 加密与解密,编码特殊字符,处理中文路径
Base64编码 - Base64 加密与解密,支持文本和文件的编解码
关于「字符编码与中文乱码速查」的常见问题
UTF-8 和 GBK 有什么区别?
UTF-8 是 Unicode 的一种编码方式,覆盖全世界所有字符,一个汉字通常占 3 字节,是国际标准;GBK 是中文编码标准,既是字符集也是编码方式,一个汉字占 2 字节,主要收录中文与部分符号,覆盖范围远小于 Unicode。现代开发一律优先 UTF-8,只有对接国内的遗留系统时才需要处理 GBK。需要注意的是 GB18030 作为国内强制标准,向下兼容 GBK 且能覆盖全部 Unicode 字符,是比 GBK 更稳妥的国产编码选择。
中文乱码可以自动修复吗?
部分可以,但不是全部。如果只是「编码用错」——例如 UTF-8 的文件被按 GBK 读,或者反过来——数据本身完好无损,按正确编码重新解码就能完全还原,这类是可以自动修复的。但如果中间环节做过一次「无法表示就替换」的转换(出现问号、方块、锟斤拷),原始字符已经被丢弃,任何工具都无法还原。所以乱码要尽早处理,不要在损坏的数据上反复转码。
为什么 CSV 文件用 Excel 打开中文全是乱码?
最常见的两个原因:一是文件是 UTF-8 编码但没有 BOM,Excel 默认按系统本地编码(简体中文环境是 GBK)解释,于是乱码——解决方法是导出时加上 BOM,这是最快的一招;二是文件本来就是 GBK 编码但被当成了其他编码。另外可以用 Excel 的「数据 → 从文本/CSV」导入功能,在向导里手动指定文件编码,这样不管有没有 BOM 都能正确读入。
UTF-8 里一个汉字占几个字节?
常见汉字是 3 个字节,这也是「UTF-8 比 GBK 更占空间」说法的来源(GBK 里汉字固定 2 字节)。补充两点:ASCII 字符在 UTF-8 里仍然只占 1 字节,所以纯英文内容用 UTF-8 完全不亏;emoji 等增补平面字符占 4 字节,这也是数据库字段长度估算时容易低估的地方——按字符数限长的字段要留意它可能吃掉两倍的字节空间。
继续查:相关内容
全部速查 →内容说明:本页速查数据由本站自行整理,事实性内容以对应官方规范与文档为准,未复制第三方速查表或百科的表述。数据最后核对日期:2026-10-05。若发现错误或已更新的标准,欢迎通过页脚反馈入口告知。
速查在线工具箱