趙云叫化凍?曹操叫變巨?一文帶你讀懂字符編碼那些事兒
本文轉(zhuǎn)載自微信公眾號(hào)「活在信息時(shí)代」,作者活在信息時(shí)代。轉(zhuǎn)載本文請(qǐng)聯(lián)系活在信息時(shí)代公眾號(hào)。
早期玩光榮三國(guó)游戲的同學(xué)一定會(huì)對(duì)游戲中人物名稱的亂碼印象非常深刻。例如說《三國(guó)志曹操傳》,里面的曹操名字變成了“變巨”,而趙云的名字則變成了“化凍”。其它的人物名字也都是亂碼。
盡管如此,也擋不住一款優(yōu)秀的戰(zhàn)略游戲?qū)τ谕婕业奈?。很多玩家?huì)在亂碼的情況下,靠猜測(cè)和不屈的意志堅(jiān)持玩下去。而一些懂一點(diǎn)技術(shù)的同學(xué)則會(huì)使用各種轉(zhuǎn)碼工具,將亂碼轉(zhuǎn)換成可以閱讀的繁體字。
那么為什么會(huì)出現(xiàn)這種亂碼的情況呢?那就要從計(jì)算機(jī)對(duì)于字符的存儲(chǔ)格式開始說起了。
我們知道計(jì)算機(jī)是以二進(jìn)制方式存儲(chǔ)數(shù)據(jù)的。而字符編碼則決定了同樣的二進(jìn)制數(shù)據(jù)計(jì)算機(jī)顯示出來字符具體是什么。例如最簡(jiǎn)單的ASCII碼,二進(jìn)制數(shù)0100 0001,也就是16進(jìn)制的0x41,就代表字母A。所以如果計(jì)算機(jī)看到這串二進(jìn)制,又是以ASCII編碼的話,那就會(huì)把它顯示成A。同時(shí)的,0110 0001,即16進(jìn)制的0x61就代表字母a。
那么如果有另一種編碼,把0100 0001這串二進(jìn)制給定義成“一”的話,那么以這種編碼格式讀取的這串二進(jìn)制,就會(huì)顯示成“一”了。
這就是為什么早期的老游戲會(huì)出現(xiàn)亂碼問題了。原因就在于,那些游戲多數(shù)是以臺(tái)灣的Big5繁體字編碼編成的,而在我們的電腦上,則以大陸的GBK簡(jiǎn)體編碼顯示,那就出問題了。
下面小編就用Mysql數(shù)據(jù)庫自帶的轉(zhuǎn)碼函數(shù),給大家演示一下,“化凍”是怎么變成趙云的。
第一步:我們先查出化凍的16進(jìn)制編碼
這里面hex函數(shù)用于顯示字符串的16進(jìn)制編碼,convert函數(shù)將化凍兩個(gè)字用gbk格式編碼。
執(zhí)行之后,我們得到化凍兩個(gè)字在gbk編碼下的16進(jìn)制表示。
我們可以看到BBAFB6B3,就是化凍兩個(gè)字在gbk編碼下的16進(jìn)制表示了。如果轉(zhuǎn)換成二進(jìn)制的話即為1011 1011 1010 1111 1011 0110 1011 0011。
第二步:將16進(jìn)制編碼轉(zhuǎn)換成big5碼
這里面,我們把剛才查找出來的化凍兩個(gè)字對(duì)應(yīng)的16進(jìn)制數(shù)字轉(zhuǎn)換成big5碼格式,看看big5碼里面,這串16進(jìn)制數(shù)字代表什么。于是我們看到,在big5碼里,這串?dāng)?shù)字被顯示成了繁體字的趙云。這樣,我們就看到了為什么在一些老游戲里面,用big5碼開發(fā)的游戲,在大陸的簡(jiǎn)體中文系統(tǒng)上,為什么會(huì)變成亂碼了。
同樣的,我們可以查到變巨的16進(jìn)制,以及對(duì)應(yīng)的big5碼。
類似的還有
而現(xiàn)在,由于硬件價(jià)格的大幅下降,大部分軟件都已經(jīng)使用unicode開發(fā)了,于是可以在世界上大部分的電腦上使用。然而依然還有一些軟件,在一些情況下還會(huì)有編碼問題哦。例如說最新版的Mysql,在中文windows操作系統(tǒng)的電腦上,如果電腦名使用了中文字符的話,就會(huì)出現(xiàn)安裝錯(cuò)誤哦。