TXT 小说变成乱码:GBK 编码怎么修

你打开一个 .txt,屏幕上不是中文,而是一堆奇怪的符号。文件多半没坏。字节都在,只是被用错误的对照表读出来了。

为什么会这样

纯文本文件不会在自己内部注明用了什么编码。它就是一串字节,怎么解读由打开它的程序决定。

中文的历史文件大多是 GBK。网络小说站点导出的 TXT、老网页的存档、早年软件保存的文本,基本都属于这一类。

编码常见来源
UTF-8现在的标准,各种文字都能表示
GBK简体中文的通行编码,GB2312 的扩展
GB18030强制性国家标准,覆盖范围最广
Big5繁体中文来源
UTF-16某些 Windows 程序导出

一个好认的特征

GBK 和 Big5 都用两个字节表示一个汉字,而且两个字节的最高位都是 1。当这些字节被当成 Latin-1 读出来,每一个汉字就变成两个带重音的拉丁符号。

所以乱码有个很明显的样子:屏幕上的字数大约是原文的两倍,而且夹着大量 § ª ¥ ¡ 这类符号。看到这个形状,基本可以断定是中文编码被当成西欧编码读了。

另一种:只有个别字坏掉

如果整体正常,只有零星几个字变成问号或方块,那多半是字集范围的问题,不是整体编码猜错。

GBK 收的字有限,古籍和人名里的生僻字要靠 GB18030 才覆盖得到。用 GBK 去读含生僻字的文件,就会只有那几个字坏掉。

应用目前的行为

说清楚更好:Aurora Reader 先试 UTF-8,失败就退回 Latin-1。它不会识别 GBK,设置里也没有选编码的地方。

Latin-1 同时解释了为什么你看到的是乱码而不是报错。在那个编码里每个字节都能对应上某个符号,所以退路永远「成功」,只是给出错的字。

这个行为已经记录成问题

怎么修

在电脑上对副本转码,再把转好的文件传回手机:

iconv -f GBK -t UTF-8 book.txt > book-utf8.txt

如果转出来一半正常一半还是乱,那多半是繁体来源,把 -f GBK 换成 -f BIG5 再试。碰到生僻字报错就改用 -f GB18030,它的覆盖范围比 GBK 大。

Windows 上用记事本另存为、编码选 UTF-8 也行,但几十兆的小说会很慢。

一律拿副本操作:指定错编码的转换是不可逆的。

压缩包里的文件名乱码

有时候是反过来的:里面的文字正常,解压出来的文件名却是乱码。

这是另一回事。ZIP 格式长期没规定文件名的编码,Windows 的压缩软件用 GBK 写文件名,而安卓上的解压工具通常按 UTF-8 读。内容不受影响。

文件不多就直接改名最快。数量多的话,在电脑上用能指定文件名编码的解压软件处理完,再传过去

章节读不出来是另一回事

还有一种情况:字都是对的,可目录空空如也,几百万字挤成一整团。

这不是编码问题。应用识别章节时比对的是 Chapter 1CHAPTER IVPart 2 这几种英文写法,中文的「第一章」「第一百零三章」不在里面,所以中文 TXT 基本不会生成目录。

同一段代码还有个连带影响:字数是靠空格切出来数的。中文不用空格分词,所以一部长篇可能只被算成几千个「词」,据此估出来的页数严重偏低,阅读进度也跟着不准。

这两点也一并反馈给应用项目了:章节识别字数统计。眼下的替代办法是找同一本书的 EPUB 版本,章节结构本来就写在文件里。

这不是文件损坏

坏掉的文件通常打不开,或者读到一半中断。整本从头到尾稳定地显示错字,说明字节是完整的。区别写在判断文件是否损坏

改扩展名没有用,因为扩展名和内容的字节毫无关系。

还有一种:字体

如果字是对的,但个别字变成空心方块,那既不是编码也不是损坏,而是字体缺字。

GB18030 覆盖了大量生僻字和少数民族文字,但手机自带字体不一定画得出来,画不出来就显示成方块。古籍和人名里的生僻字最容易碰上。解法是换一个字库更全的字体

不想再碰上

同一本书有 EPUB 就拿 EPUB。EPUB 把编码写在文件里,这个问题根本不会发生。中文维基文库的 EPUB 导出就是为此好用。

所有文章