你收到同事发来的一份文档,双击打开,标题位置写着"鏂囦欢",正文一片怪字,只有英文和数字是正常的。第一反应多半是:文件坏了?中毒了?其实大概率都不是——这份文件的数据一个数都没少,只是你的软件拿错了"对照表"来读它。乱码的核心一句话:文字在电脑里是按编码表存成数字的,存的时候用一张表,读的时候拿了另一张表,字就全变了样。
电脑里其实没有"字",只有数字
电脑存不下"文"这个字形,它只认数字。所以你打字、保存文件时,每个字都要按一张对照表翻成一串数字存起来;打开时再按同一张表把数字翻回字。这张对照表就叫字符编码表。
可以拿老式电报做个对照:当年发电报,要把每个汉字按一本电码翻成数字发出去,收报人拿同一本电码翻回来。要是两边用的不是同一本,同一串数字就译出完全不同的字。电脑里的编码表就是这个道理,只是表换成了国家标准和国际标准。
麻烦在于,这样的表不止一张。中文老牌编码是 GB2312 和它的扩展 GBK,一个汉字在里面占两个字节;现在全球通用的是 UTF-8,常用汉字占三个字节,部分生僻字会占四个字节。同一个"文"字,在两张表里编出来的数字完全不一样。只有英文和数字省心——它们在这里比较的GBK、UTF-8等兼容ASCII的编码里相同,所以拿错表时英文照常显示,中文立刻变脸。这也是这类例子里常常只见中文变乱的原因。
拿错一张表,字就"变脸"
回头看开头那份文档。"文件"两个字按 UTF-8 存成了 6 个数字;你的软件却按 GBK 的规矩——两个数字拼一个汉字——去读,于是拼出了"鏂囦欢"。数据从头到尾都在,只是被切错了组、查错了表。
这种事的高发地带很有规律:多年前的旧文档和老网页(当年国内流行 GBK)、Excel 双击打开的 CSV 名单、手机和电脑之间互传的 txt 记事本、没标明编码的网页。凡是要跨软件、跨系统、跨年代读中文的地方,就容易撞上两张表不一致。
还有一种更怪的"锟斤拷",是错上加错:软件读到不认识的数字,会先塞进去一个"替换符号"充数;两个替换符号连在一起,按UTF-8存下的六个字节再被当成GBK读,就可能成了这三个怪字。看到它,说明这份文本已经被人拿错表处理过不止一轮了。
记住一个判断:绝大多数乱码是"读错",不是"写坏"——文件没坏,只是念的人拿错了表。
同一组字节,两张表两种读法
- 01按UTF-8
文件
- 02误按GBK
鏂囦欢
E6 96 87 E4 BB B6:已用本机编码程序逐字节复测。
乱码还能不能救回来
分两种情况。
能救的大多数:找回原来那张表,重新读一遍。 记事本、代码编辑器一般都有"以某编码重新打开"或右下角的编码切换,UTF-8 和 GBK 各试一次,正常的那张就是对的。Excel打开CSV名单时,可以用"数据→从文本/CSV 导入",选择与原文件一致的编码;原文件是UTF-8,就选UTF-8。嫌麻烦也可以让发件人"另存为 UTF-8"重发一份。
救不回的一种:错误替换已经写回文件,原字节丢了。 如果原文已经被问号或替换字符覆盖保存,换编码也找不回被丢掉的信息,只能找原件或备份。但屏幕暂时显示问号、方框,不代表原文件一定已经损坏。
顺手纠正两个常见误会:这种编码不匹配造成的乱码不等于病毒或文件损坏,别急着杀毒重下;它也不是"被加密了"——编码表是全世界公开的翻译规则,只负责把字和数字对上,不负责保密,和加密是两回事。