用 Python3 实现“瓣в变巨肚”

概述

光荣的游戏《三国志曹操传》相信不少人都玩过。当年由于乱码,致使不少人没有办法游玩正确的简体中文版,而是玩的全程不知所云的乱码版。其中,曹操就是大名鼎鼎的“变巨”。“瓣в变巨肚”其实就是“三国志曹操传”的乱码版本。python

闲话很少说了。今天我想和你们分享一下,怎样用短短几行 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

image.png

其实仔细看的话,当年的标题栏确实开头是有一个空白的。咱们换一个老一点的控制台,也是能够看到相同的效果的:

image.png

相关文章
相关标签/搜索