字符编码与中文乱码速查

5 个速查板块 · 关联 5 款站内工具 · 数据最后核对 2026-10-05

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-8Unicode 的编码方式变长,1 到 4 字节。中文通常占 3 字节,是互联网事实标准
UTF-16Unicode 的编码方式变长 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 参数,缺失会导致中文主题乱码

关于「字符编码与中文乱码速查」的常见问题

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。若发现错误或已更新的标准,欢迎通过页脚反馈入口告知。