情况一:显示 �,但文件其实没问题
如果记事本、播放器或浏览器里满屏都是 �,通常是文件用 GBK(GB2312、GB18030,也就是中文 Windows 的 ANSI)保存,却被当成 UTF-8 读取。汉字的字节在 UTF-8 中无效,软件只是在显示时换成了替换字符 �。文件里的字节其实还是对的。
解决方法: 把原始文件拖到上面的框中。Mojibuster 读取时会识别编码,并把文件转换成 UTF-8。注意:一定要用原始文件,不要从软件里复制文字,复制后 � 就真的固定下来了。详见 GBK 转 UTF-8。
情况二:? 或 � 已经保存在文本里
如果软件已经把带替换字符的文本保存或传给了别的系统,原来的汉字就丢失了。? 也是一样:当目标编码里没有这个字符时,软件就会写入 ?。例如保存为 ASCII,或者写入不支持中文的数据库字段时,每个汉字都会变成 ?。
这种情况无法反推,因为所有汉字都变成了同一个符号。Mojibuster 不会乱猜,而是告诉你有多少处受影响。只能从源头解决:重新导出,或者使用备份。
中文变成问号的常见原因
- 数据库: 字段或连接用的是
latin1或ascii,而数据是 UTF-8。MySQL 会把无法存储的汉字换成?,参见 MySQL 和 phpMyAdmin。 - PowerShell 5.1:
Export-Csv默认以 ASCII 写入,汉字会变成?,参见 PowerShell。 - Python:
encode('ascii', errors='replace')会悄悄把字符换成?,参见 Python 和 pandas。 - 记事本另存为 ANSI: 中文 Windows 的 ANSI 就是 GBK。表情符号、部分生僻字或其他语言的文字 GBK 里没有,保存后会变成
?。 - 命令行窗口: Windows 控制台遇到当前代码页(如 936)不支持的字符时显示为
?。通常只是显示有问题,文件本身没坏。
如何判断是哪种情况
- 用能显示编码的编辑器打开文件,例如 Notepad++。如果状态栏显示“ANSI”或“GB2312”,就是情况一。
- 把文件拖到 Mojibuster 中。如果结果显示按 GBK 读取,汉字也恢复了,那就是情况一,参见 GBK 转 UTF-8。
- 如果 Mojibuster 提示有字符丢失,就是情况二,只能重新导出。
如果看到的不是问号,而是 濮撳悕 这样的生僻字,那是另一种错误,几乎都能修复:乱码是什么。
常见问题
Mojibuster 能把 ? 变回汉字吗?
不能。一个 ? 可能代表任何字,信息已经没有了。Mojibuster 不会改动这些地方,但会告诉你有多少处。
为什么一个软件显示 �,另一个软件却正常?
说明文件没问题,只是其中一个软件用错了编码读取。用 Mojibuster 转成 UTF-8 后,两个软件都能正常显示。
� 是什么字符?
它是替换字符 U+FFFD。软件无法把某个字节读成字符时就会显示它。它表示编码出了错,并不是原文的一部分。