用 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

相關文章
相關標籤/搜索