概述
光彩的游戏《三国志曹操传》置信很多人都玩过。当年因为乱码,导致很多人没有方法玩耍正确的简体中文版,而是玩的全程不知所云的乱码版。其中,曹操就是赫赫有名的“变巨”。“瓣в变巨肚”其实就是“三国志曹操传”的乱码版本。
闲话不多说了。明天我想和大家分享一下,怎么用短短几行 Python 代码重现上述的编码谬误。
Python 实现及原理
起初,这款游戏被台湾引进,并翻译成了繁体中文版。过后还没有遍及 Unicode,所以各地都有本人的一套编码字符集。台湾应用的是 Big5,而大陆过后应用的广泛是 GB2312、GBK 等。所以,咱们只须要把正确的内容依据 Big5 进行编码,而后再用 GBK 进行解码,就能失去如题目那样的乱码了。
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 无奈辨认,于是就报错了。
那么怎么解决呢?其实也很简略,只须要给 decode()
加一个疏忽报错即可:
res = codecs.decode(byte, 'gbk', 'ignore')
这个 ignore
的作用就是疏忽解码过程中遇到的无奈辨认的编码。其余可选的还有 strict
等。详见
这样,咱们就能够“正确”地失去后果了:
T瓣в变巨肚
为什么结尾会有一个“T”?其实结尾那个是一个无奈被 GBK 辨认的字节。在比拟旧的操作系统上会显示为“?”,或者罗唆空白。
其实认真看的话,当年的标题栏的确结尾是有一个空白的。咱们换一个老一点的控制台,也是能够看到雷同的成果的:
发表回复