TXT 打开是乱码怎么办?GBK 和 UTF-8 是怎么回事

TXT 文件里存的只是一串字节。打开后是乱码,通常不是文件坏了,而是打开它的软件用了与保存时不同的编码去解读这串字节。中文 TXT 最常见的编码是 UTF-8 和 GBK:换成另一种编码重新打开,或者把文件转换成 UTF-8,多数乱码都能恢复。动手之前,请先复制一份原文件。

编码是什么

计算机保存文字时,要按一套规则把每个字变成字节,这套规则就是编码;打开文件时,软件再按某种编码把字节翻译回文字。保存与打开用的是同一种编码,文字就正常;用的不是同一种,就会出现乱码。

同一个汉字在不同编码里是不同的字节。以「我们」为例:

编码「我们」保存成的字节(十六进制)
UTF-8E6 88 91 E4 BB AC
GBKCE 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 编码:

  1. 用记事本打开文件,确认文字显示正常。
  2. 选择「文件」›「另存为」,在对话框底部的「编码」中选择「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 编码的新文件,再传到手机上即可。