检测流程:先识别 BOM 字节序标记,再做 UTF-8 严格合法性校验与 UTF-16 零字节分布判断,最后交给 jschardet 做统计模型打分,三层结果合并后给出结论。
原理:把屏幕上看到的乱码字符按某个编码还原成原始字节,再换另一个编码重新解码,逐一组合打分后给出最可能的原文。
浏览器里的文本已经是 Unicode 字符,不再保留来源编码信息,因此纯文本无法反推原编码;本模式改为分析它可以用哪些编码安全保存。要判定来源编码,请使用文件或字节序列模式。
| 可信度 | 推断链路 | 还原结果 | 操作 |
|---|---|---|---|
| 点击「开始检测」后,这里会列出最可能的原文 | |||
| 编码 | 字节数 | 覆盖情况 | 无法表示的字符 |
|---|
字节序列检测:只拿到一串十六进制或 Base64(比如抓包、日志、数据库 BLOB 字段)时使用,粘贴进来即按同一套算法判定。
乱码还原:文字已经显示成乱码、拿不到原始文件时使用。工具会穷举「用什么编码读错 × 原本是什么编码」的组合,按中日韩字符比例和替换符数量打分排序。
文本编码分析:准备把内容存成 GBK、Big5 等老编码前使用,提前看清字节占用,以及哪些生僻字、emoji、特殊符号会丢失。
| 编码 | 特点 | 典型来源 | 中文占用 |
|---|---|---|---|
| UTF-8 | Unicode 的变长实现,1 到 4 字节,ASCII 完全兼容,字节序列有严格的前缀规则,因此可以被精确校验 | 网页、接口、Git 仓库、macOS 与 Linux | 常用汉字 3 字节 |
| UTF-8 BOM | 文件头多出 EF BB BF 三字节,Windows 记事本的默认行为,会让部分解析器读到多余字符 | Windows 记事本、旧版 Excel 导出 | 常用汉字 3 字节 |
| GB2312 / GBK / GB18030 | 逐代扩充的中文国标,GB2312 收录 6763 字,GBK 补齐繁体与罕用字,GB18030 向上兼容并覆盖全部 Unicode | Windows 中文系统、国产旧软件导出 | 常用汉字 2 字节 |
| Big5 | 繁体中文双字节编码,次字节范围与 GBK 重叠,短文本容易与 GBK 互相误判 | 台湾、香港地区的旧文档 | 常用汉字 2 字节 |
| Shift_JIS | 日文编码,单字节半角片假名与双字节汉字混排,是日文系统 CSV 的常客 | 日文 Windows、日系设备导出 | 汉字 2 字节 |
| EUC-KR | 韩文编码,覆盖谚文音节与汉字,双字节结构 | 韩文旧系统 | 谚文 2 字节 |
| Windows-1252 | 西欧单字节编码,ISO-8859-1 的超集,中文 UTF-8 字节被它读出来就是经典的 ä½ å¥½ 型乱码 | 欧美旧网页、旧邮件 | 不支持中文 |
| UTF-16 LE / BE | 定长 2 字节为主,ASCII 字符会夹带大量 00 字节,零字节落在奇位还是偶位决定字节序 | Windows API 导出、部分数据库 | 常用汉字 2 字节 |
为什么粘贴普通文本不能检测出原来的编码?
文本一旦被粘贴进浏览器,就已经是解码完成的 Unicode 字符,原始字节和来源编码都已经丢失,再检测只会恒定得到 UTF-8,没有参考价值。所以本工具把这件事拆成了两条可靠路径:有文件就用文件模式读原始字节,只有字节串就用字节序列模式,两者判定的都是真实数据。
GBK 和 GB2312 的结果为什么经常互相串?
GB2312 是 GBK 的子集,二者字节结构一致,统计模型只能根据用字范围给出倾向性判断。实际处理时按 GB18030 解码最稳妥,它向上兼容 GB2312 与 GBK,不会因为出现罕用字而解码失败。
乱码还原失败或者结果仍然是乱码?
如果乱码里出现了大量问号或菱形问号,说明原始字节在上一次解码时就已经被替换符覆盖,信息不可逆地丢了,任何工具都无法完整还原。这种情况只能回到最初的文件重新按正确编码读取。另外,还原依赖足够长的样本,几个字的片段打分区分度很低,建议多贴一些内容。
检测结果和预览对不上该信哪个?
以预览为准。统计模型对短文本、纯数字表格、代码文件的区分能力有限,而预览是用真实解码器跑出来的结果。切换下拉框逐个试,哪个编码读出来的文字通顺就用哪个,再另存为 UTF-8。
大文件会不会把浏览器卡死?
不会。文件按字节读入后,统计模型只取开头约 512KB 作为样本,解码预览也按设定的字符上限截断,因此几十 MB 的日志也能快速出结果。文件始终留在本机内存,不产生任何网络请求。
另存为 UTF-8 时要不要勾 BOM?
给 Excel 打开的 CSV 建议带 BOM,否则中文会乱码;其余场景一律选不带 BOM 的版本,很多编译器、解析器和 Shell 脚本会把 BOM 当成正文内容从而报错。
