关于python3.x:用-Python3-实现瓣в变巨肚

概述

光彩的游戏《三国志曹操传》置信很多人都玩过。当年因为乱码,导致很多人没有方法玩耍正确的简体中文版,而是玩的全程不知所云的乱码版。其中,曹操就是赫赫有名的“变巨”。“瓣в变巨肚”其实就是“三国志曹操传”的乱码版本。

闲话不多说了。明天我想和大家分享一下,怎么用短短几行 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 辨认的字节。在比拟旧的操作系统上会显示为“?”,或者罗唆空白。

其实认真看的话,当年的标题栏的确结尾是有一个空白的。咱们换一个老一点的控制台,也是能够看到雷同的成果的:

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理