极简工具箱

免费在线工具 · 本地计算 · 无需上传

中文乱码怎么排查:锟斤拷、烫烫烫、问号各是什么

乱码不是一种问题,而是一类症状。看到「锟斤拷」「烫烫烫」「???」其实指向完全不同的原因,认对了才能一次修好。

广告位(百度联盟)

一、先学会认症状

你看到的真实原因能否还原
锟斤拷UTF-8 的替换字符 U+FFFD 被按 GBK 解码基本不可逆,原始信息已丢
烫烫烫 / 屯屯屯程序里未初始化的内存(0xCC/0xCD)被当文本打印与编码无关,是代码 bug
??? / 问号目标编码不支持该字符,编码时被替换不可逆
餐 之类西欧字符UTF-8 字节被当成 Latin-1/Windows-1252通常可逆
只有部分字乱混合编码,或字体缺字(显示为方框)视情况

「锟斤拷」的来历值得记一下:UTF-8 遇到无法解码的字节会输出替换字符 U+FFFD,它的 UTF-8 字节是 EF BF BD;这段字节再被 GBK 解码,EF BF 正好对应「锟」,BD EF 对应「斤」,重复几次就成了「锟斤拷」。所以看到它基本可以判定:数据在某一环被错误解码过一次,已经损坏,不是简单换个编码就能修好。

二、乱码的唯一根因

写入和读取用了不同的编码。具体到工程里,常见的四类位置:

  1. 文件:编辑器按 UTF-8 保存,程序按 GBK 读;或反过来。
  2. HTTP:响应头 Content-Type: text/html; charset=iso-8859-1 与实际内容不符;表单提交没声明编码。
  3. 数据库:连接串 characterEncoding 与表字符集不一致;latin1 表里存了 UTF-8 字节。
  4. 终端:LANG=C 的服务器上 cat 中文文件、或用 SSH 工具编码设置不对。

三、修复顺序(别跳步)

  1. 先确认原始字节。用十六进制看:E4 B8 AD 是 UTF-8 的「中」,D6 D0 是 GBK 的「中」。看字节比看乱码字符可靠得多。
  2. 按源编码解码成正确文本。命令行可用 iconv -f GBK -t UTF-8 in.txt -o out.txt。
  3. 再按目标编码保存/输出,并让所有环节声明一致。
  4. 最后统一声明:HTML 加 <meta charset="UTF-8">,HTTP 头带 charset,数据库连接串写明编码。

跳过第 1 步直接「用工具转一下」,是把自己从一个乱码变成另一个乱码的最快方式。

四、几个易忽略的细节

五、怎么快速验证

拿不准某个字符的编码时,用 Unicode 转换工具 查它的码点与 UTF-8 字节,再用 URL 编码解码 对照百分号形式。两步对照,基本能定位是哪一环把字节读错了。

小结

锟斤拷 = 已被错误解码的 UTF-8(多半不可逆);烫烫烫 = 未初始化内存,不是编码问题;问号 = 目标编码不支持。修乱码的正确姿势永远是:先看字节,再定编码,最后统一声明。

本文相关工具(本地计算,无需上传)

更多使用教程