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 1、CHAPTER IV、Part 2 这几种英文写法,中文的「第一章」「第一百零三章」不在里面,所以中文 TXT 基本不会生成目录。
同一段代码还有个连带影响:字数是靠空格切出来数的。中文不用空格分词,所以一部长篇可能只被算成几千个「词」,据此估出来的页数严重偏低,阅读进度也跟着不准。
这两点也一并反馈给应用项目了:章节识别和字数统计。眼下的替代办法是找同一本书的 EPUB 版本,章节结构本来就写在文件里。
这不是文件损坏
坏掉的文件通常打不开,或者读到一半中断。整本从头到尾稳定地显示错字,说明字节是完整的。区别写在判断文件是否损坏。
改扩展名没有用,因为扩展名和内容的字节毫无关系。
还有一种:字体
如果字是对的,但个别字变成空心方块,那既不是编码也不是损坏,而是字体缺字。
GB18030 覆盖了大量生僻字和少数民族文字,但手机自带字体不一定画得出来,画不出来就显示成方块。古籍和人名里的生僻字最容易碰上。解法是换一个字库更全的字体。
不想再碰上
同一本书有 EPUB 就拿 EPUB。EPUB 把编码写在文件里,这个问题根本不会发生。中文维基文库的 EPUB 导出就是为此好用。