光荣的游戏《三国志曹操传》相信不少人都玩过。当年由于乱码,致使不少人没有办法游玩正确的简体中文版,而是玩的全程不知所云的乱码版。其中,曹操就是大名鼎鼎的“变巨”。“瓣в变巨肚”其实就是“三国志曹操传”的乱码版本。python
闲话很少说了。今天我想和你们分享一下,怎样用短短几行 Python 代码重现上述的编码错误。编码
起初,这款游戏被台湾引进,并翻译成了繁体中文版。当时尚未普及 Unicode,因此各地都有本身的一套编码字符集。台湾使用的是 Big5,而大陆当时使用的广泛是 GB23十二、GBK 等。因此,咱们只须要把正确的内容根据 Big5 进行编码,而后再用 GBK 进行解码,就能获得如标题那样的乱码了。spa
import codecs word = '曹操' byte = codecs.encode(word, 'big5') res = codecs.decode(byte, 'gbk') print(res)
这样,咱们就获得了“变巨”。那是否是这样就结束了?其实并无。好比咱们还能够试试“三國志曹操傳”。注意这里用的是繁体。咱们可不但愿用 Big5 编码简体字,毕竟台湾用的可不是简体中文。操作系统
结果竟然报错了:翻译
UnicodeDecodeError: 'gbk' codec can't decode byte 0xa4 in position 0: illegal multibyte sequence
这是由于,Big5 和 GBK 所涵盖的二进制编码有各自“专属”,也就是不属于两者交集的部分。上述的 0xa4
就是其中之一。遇到这个状况,GBK 没法识别,因而就报错了。code
那么怎么解决呢?其实也很简单,只须要给 decode()
加一个忽略报错便可:游戏
res = codecs.decode(byte, 'gbk', 'ignore')
这个 ignore
的做用就是忽略解码过程当中遇到的没法识别的编码。其余可选的还有 strict
等。详见it
这样,咱们就能够“正确”地获得结果了:io
T瓣в变巨肚
为何开头会有一个“T”?其实开头那个是一个没法被 GBK 识别的字节。在比较旧的操做系统上会显示为“?”,或者干脆空白。class
其实仔细看的话,当年的标题栏确实开头是有一个空白的。咱们换一个老一点的控制台,也是能够看到相同的效果的: