在windows下 gbk,linux下utf-8注意事項(xiàng)

問(wèn)題描述:
大部分國(guó)人的windows操作系統(tǒng)上都是GB2312,而在Linux上的默認(rèn)編碼都是utf-8。
所以在進(jìn)行編碼,解碼的時(shí)候要注意了,在windows下
在cmd中輸入chcp可以看到

活動(dòng)代碼頁(yè):936

936 代表 中國(guó) - 簡(jiǎn)體中文(GB2312)

在linux下查看字符集

locale

在cmd中敲如下命令

python
str = '中文'
str.decode(‘gbk’)

這個(gè)不會(huì)報(bào)錯(cuò),因?yàn)樵趙indows下使用的編碼集是GB2312,當(dāng)我們嘗試以GBK(GB2312的擴(kuò)展)這個(gè)編碼集去解碼字符串str成unicode的時(shí)候,不會(huì)報(bào)錯(cuò),因?yàn)?,使用了正確的編碼集去解碼字符串

但是同樣的代碼在系統(tǒng)默認(rèn)編碼為utf-8的操作系統(tǒng)中(例如linux的系統(tǒng)都是默認(rèn)是utf-8的)就會(huì)報(bào)錯(cuò)

在Linux的bash中敲如下命令

python
str = '中文'
str.decode(‘gbk’)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'gbk' codec can't decode bytes in position 2-3: illegal multibyte sequence

因?yàn)閘inux下默認(rèn)的編碼集是utf-8,所以linux內(nèi)部的字符串從一開(kāi)始被聲明就以u(píng)tf-8的編碼方式進(jìn)行了編碼,就相當(dāng)于字符串的每一個(gè)字符都被映射到了utf-8中的特定二進(jìn)制碼。utf-8和GBK這兩個(gè)不同的字符集,規(guī)定的字符與二進(jìn)制之間的映射關(guān)系除了二進(jìn)制碼小于127之外的其余映射關(guān)系都不同。
舉個(gè)簡(jiǎn)單例子來(lái)說(shuō)明映射關(guān)系:
utf-8規(guī)定1代表蘋(píng)果
而GBK規(guī)定1代表梨子
你在windows下,1就代表梨子,在linux下,1就代表蘋(píng)果。
但是又由于字符串通常是多位二進(jìn)制碼來(lái)表示的,當(dāng)只要有一個(gè)位置的二進(jìn)制碼不能被正確解碼的時(shí)候,就會(huì)出現(xiàn)上訴錯(cuò)誤。
此外當(dāng)我們使用python2寫(xiě)python module(以.py為后綴的文件)的時(shí)候,可以在行首聲明該腳本的默認(rèn)編碼方式為utf-8,否則以python2默認(rèn)的編碼方式,是無(wú)法解碼中文字符的。

另外,如果在pyhton2中

python
str = '中文'
str.decode(‘a(chǎn)scii’)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)

因?yàn)樵谧址痑scii的映射關(guān)系中,對(duì)二進(jìn)制碼大于127的,沒(méi)有規(guī)定映射關(guān)系,所以當(dāng)二進(jìn)制碼大于127,就會(huì)解碼失敗。
0xe4的十進(jìn)制是228,已經(jīng)大于127,所以用ascii解碼的時(shí)候,不能正常解碼。

對(duì)于pyhton2,當(dāng)我們?cè)谑褂肞ycharm等IDE的時(shí)候,可以在每個(gè)pyhton module的開(kāi)頭聲明該腳本的編碼集為utf-8,因?yàn)閜ython的默認(rèn)編碼是ascii,不包含中文的編碼集,自然也不能正確解碼中文字符串等其他二進(jìn)制碼大于等于128的字符。

# -*- coding: utf-8 -*-

關(guān)于utf-8,utf-16,gbk,ascii這些字符集以及unicode。推薦參考:
https://www.zhihu.com/question/23374078/answer/69732605

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容