TXT 打开是乱码怎么办?GBK 和 UTF-8 是怎么回事
TXT 文件里存的只是一串字节。打开后是乱码,通常不是文件坏了,而是打开它的软件用了与保存时不同的编码去解读这串字节。中文 TXT 最常见的编码是 UTF-8 和 GBK:换成另一种编码重新打开,或者把文件转换成 UTF-8,多数乱码都能恢复。动手之前,请先复制一份原文件。
编码是什么
计算机保存文字时,要按一套规则把每个字变成字节,这套规则就是编码;打开文件时,软件再按某种编码把字节翻译回文字。保存与打开用的是同一种编码,文字就正常;用的不是同一种,就会出现乱码。
同一个汉字在不同编码里是不同的字节。以「我们」为例:
| 编码 | 「我们」保存成的字节(十六进制) |
|---|---|
| UTF-8 | E6 88 91 E4 BB AC |
| GBK | CE D2 C3 C7 |
中文 TXT 常见的是这两种编码:
- GBK:中文 Windows 长期使用的本地编码。它在更早的 GB2312 基础上扩充了字数,后来的 GB18030 又在 GBK 的基础上继续扩充。Windows 记事本的编码选项里把它叫作「ANSI」:在简体中文的 Windows 上,ANSI 指的就是 GBK。
- UTF-8:现在通行的编码,能表示几乎所有语言的文字,网页和大多数新软件都使用它,较新的 Windows 记事本也默认以 UTF-8 保存。
从乱码的样子判断是哪种情况
| 乱码的样子 | 例子 | 原因 | 怎么办 |
|---|---|---|---|
| 一串生僻汉字 | 「我们」显示为「鎴戜滑」,「你好」显示为「浣犲ソ」 | UTF-8 的文件被当作 GBK 打开 | 改用 UTF-8 打开 |
| 一串「�」(菱形里的问号),夹杂零星的字 | 「我们」显示为「����」 | GBK 的文件被当作 UTF-8 打开 | 改用 GBK 打开,或者转换成 UTF-8 |
| 反复出现「锟斤拷」 | 「我们」最后显示为「锟斤拷锟斤拷」 | 原文曾被替换成「�」并保存,之后又被当作 GBK 读出 | 无法从这个文件还原,见下文 |
怎样换编码打开,或者转换成 UTF-8
Windows 记事本
记事本适合处理「在电脑上显示正常,换到手机或别的软件就乱码」的文件,这类文件多半是 GBK 编码:
- 用记事本打开文件,确认文字显示正常。
- 选择「文件」›「另存为」,在对话框底部的「编码」中选择「UTF-8」,换一个文件名保存。
另存为是把屏幕上显示的文字按新的编码写出。如果记事本里显示的已经是乱码,另存为只会把乱码固定下来,这时请改用 VS Code。
VS Code
VS Code 窗口右下角的状态栏会显示当前文件的编码,例如「UTF-8」。点按它,可以选择:
- 「通过编码重新打开」:只换一种编码解读,不改动文件。乱码时先用它,在 UTF-8 与 GBK 之间换着试,直到文字显示正常。
- 「通过编码保存」:把当前显示的文字按所选的编码写回文件。文字显示正常以后,再用它选择 UTF-8 保存。
macOS:用 iconv 命令转换
macOS 自带 iconv 命令。打开「终端」(在「应用程序」›「实用工具」里),执行下面的命令,把两个文件名换成实际的路径(把文件拖进终端窗口,就能填入它的路径):
iconv -f GBK -t UTF-8 原文件.txt > 新文件.txt
-f 后面是原来的编码,-t 后面是要转成的编码。转换结果写进新文件,原文件不变;新文件不要与原文件同名,否则原文件会先被清空。如果提示「Illegal byte sequence」,说明原文件不是 GBK(可能本来就是 UTF-8),或者含有 GBK 以外的字,可以把 GBK 换成 GB18030 再试。
手机上的阅读器
手机上的 TXT 阅读器与电子书 App,一般可以在设置或打开文件的选项里手动选择编码,例如 UTF-8 或 GBK。自动识别出错时,手动换一种试试。
看到乱码时,先不要保存
换一种编码重新打开不会改动文件。但如果在乱码状态下保存,软件会把屏幕上的乱码写回文件,原来的字节就被覆盖了。GBK 的文件被当作 UTF-8 打开时,读不懂的字节已经被替换成占位符「�」,而这个占位符不记得原来是哪个字,一旦保存,这部分原文就找不回来了。
「锟斤拷」就是这样来的:「�」在 UTF-8 里是 EF BF BD 三个字节,两个「�」连在一起的六个字节被按 GBK 解读,恰好是「锟斤拷」三个字。看到它,说明原来的文字早已被替换掉,换哪种编码都无法还原,只能去找出现乱码之前的副本或备份。
所以处理乱码之前,请先复制一份原文件;转换时保存为新文件,确认无误后再删除旧的。
以后怎样避免乱码
- 新建和保存 TXT 时统一选择 UTF-8,不再用 ANSI(GBK)保存。
- 收到 GBK 编码的文件,先转换成 UTF-8,再编辑或转发。
纯纯写作里的 TXT 编码
纯纯写作(Pure Writer)是一款写作用的文本编辑器,有 Android 版、iOS 版与桌面版。
导出:纯纯写作导出的 TXT 与 MD 文件都使用 UTF-8 编码。部分阅读器不支持或不能自动识别 UTF-8,打开后会显示乱码,这时请在阅读器中把文字编码手动切换为 UTF-8,或换用其他阅读器打开。详见使用手册的导出的 TXT 文件在阅读器中打开是乱码怎么办?
导入:三端的「从其他 App 导入」在导入文本文件时会自动识别编码,认得 UTF-8、UTF-16、GB18030(涵盖 GBK)、Big5 与 Shift_JIS。识别得不对时,可以在导入预览中手动切换「文本编码」;原文件不会被改动。入口见使用手册的如何打开外部文档?
常见问题
TXT 在阅读器或电子书里打开是乱码怎么办?
在阅读器的设置中把文字编码手动换成 UTF-8 或 GBK,哪一种显示正常就用哪一种。如果阅读器不能切换编码,可以先在电脑上用 VS Code 或 iconv 把文件转换成 UTF-8,再导入阅读器。纯纯写作导出的 TXT 是 UTF-8 编码。
「锟斤拷」能恢复吗?
不能从这个文件本身恢复。「锟斤拷」说明原文已经被替换成占位符「�」并保存过,原来的字节不在文件里了。只能找出现乱码之前的副本、备份,或者重新从来源获取这个文件。
「UTF-8 带 BOM」是什么,要不要选?
BOM 是写在文件开头的三个字节(EF BB BF),用来标明这个文件是 UTF-8 编码。一般选不带 BOM 的「UTF-8」即可;如果某个较旧的软件打开不带 BOM 的 UTF-8 文件时出现乱码,再试试带 BOM 的版本。反过来,不认识 BOM 的软件可能会在文件开头多显示一两个字符,例如按 GBK 解读时开头会多出「锘」。
为什么同一个 TXT 在电脑上正常,在手机上是乱码?
多半是因为这个文件是 GBK 编码:简体中文 Windows 上的记事本等软件能按 GBK 解读,所以显示正常;手机上不少 App 默认按 UTF-8 解读,就显示成了「�」。在电脑上用记事本把它另存为 UTF-8 编码的新文件,再传到手机上即可。