問(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代表蘋果
而GBK規(guī)定1代表梨子
你在windows下滓鸠,1就代表梨子,在linux下第喳,1就代表蘋果糜俗。
但是又由于字符串通常是多位二進(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