Python3 最重要的一項(xiàng)改進(jìn)之一就是解決了 Python2 中字符串與字符編碼遺留下來(lái)的這個(gè)大坑尉剩。港真曲聂,就這一點(diǎn)歌焦,安利Python3入門(mén)吶
首先介紹一下什么是編碼
在人類社會(huì)布卡,不同國(guó)家有不同的標(biāo)準(zhǔn)語(yǔ)法吭服,簡(jiǎn)體漢語(yǔ)、繁體漢語(yǔ)尸变、美式英語(yǔ)义图、英式英語(yǔ)等.....
但是機(jī)器保存數(shù)據(jù)是以一種特殊的方式來(lái)保存,讀取的時(shí)候也是以同樣的方式來(lái)解讀召烂。
在Python3當(dāng)中碱工,默認(rèn)處理中文的方式叫UTF-8∽喾颍【對(duì)比看傷害:UTF-8支持中文怕篷,Python2默認(rèn)格式是ASCII,不支持中文】
同樣的一個(gè)中文詞語(yǔ)桶蛔,例如:"中國(guó)"匙头,經(jīng)過(guò)UFT-8方法轉(zhuǎn)存到硬盤(pán)中,比如保存成了"110"仔雷,再通過(guò)UFT-8方法讀取,也是顯示"中國(guó)";通過(guò)另一種方法轉(zhuǎn)存到硬盤(pán)中碟婆,"中國(guó)"則會(huì)保存成"101"电抚,然后通過(guò)UTF-8讀取,肯定不會(huì)顯示成"中國(guó)"竖共,也許就是一個(gè)亂七八糟的亂碼"燙燙燙燙燙燙燙燙燙"蝙叛;
雖然上面的110、119公给、燙燙燙是亂填的借帘,下面示例代碼中有具體值,總之一個(gè):想要顯示正常淌铐,讀取數(shù)據(jù)時(shí)格式肺然,必須和保存數(shù)據(jù)時(shí)一致
Python3的編碼介紹
閑扯幾句——Python2 字符串設(shè)計(jì)上的一些缺陷:
- 使用ASCII 碼作為默認(rèn)編碼方式,對(duì)中文處理很不友好腿准。
- 把字符串牽強(qiáng)地分為 unicode 和 str 兩種類型际起,誤導(dǎo)開(kāi)發(fā)者
以上提及的兩個(gè)問(wèn)題,Python3都很好的解決了
- 首先吐葱,Python3 把系統(tǒng)默認(rèn)編碼設(shè)置為 UTF-8
- 然后街望,文本字符和二進(jìn)制數(shù)據(jù)區(qū)分得更清晰,分別用 str 和 bytes 表示弟跑。
文本字符全部用 str 類型表示灾前,str 能表示 Unicode 字符集中所有字符,而二進(jìn)制字節(jié)數(shù)據(jù)用一種全新的數(shù)據(jù)類型孟辑,用 bytes 來(lái)表示哎甲。
具體示例
先定義str類型的字符串:
>>> one_str = "第一個(gè)字符串"
>>> one_str
'第一個(gè)字符串'
>>> type(one_str)
str
通過(guò)str字符串,拿到byte類型數(shù)據(jù)
>>> two_byte = one_str.encode()
>>> two_str
b'\xe7\xac\xac\xe4\xb8\x80\xe4\xb8\xaa\xe5\xad\x97\xe7\xac\xa6\xe4\xb8\xb2'
>>> type(two_str)
bytes
上面的one_str是字符串類型str扑浸,并通過(guò)編碼函數(shù)encode()烧给,得到二進(jìn)制類型參數(shù)two_byte。
既然通過(guò)字符串通過(guò)編碼得到了二進(jìn)制數(shù)據(jù)喝噪,那二進(jìn)制數(shù)據(jù)肯定可以通過(guò)解碼的形式得到字符串
>>> two_byte.decode()
'第一個(gè)字符串'
當(dāng)然础嫡,在做Python爬蟲(chóng)經(jīng)過(guò)會(huì)遇到類似'\u4e2d\u56fd'的Unicode編碼格式的數(shù)據(jù),導(dǎo)致顯示的不是中文
一般打印的都是str類型酝惧,這里提供個(gè)解析方法:
>>> decode_str = "\\u4e2d\\u56fd"
>>> decode_byte = decode_str.encode() #str只有編碼函數(shù)榴鼎,先編碼
>>> decode_byte #打印byte類型變量的數(shù)據(jù)
b'\\u4e2d\\u56fd'
>>> decode_byte.decode('unicode-escape') #decode解碼函數(shù),按照unicode的數(shù)據(jù)方法解碼
'中國(guó)'
在Python3版本當(dāng)中晚唇,str類型只有encode編碼函數(shù)巫财,已經(jīng)沒(méi)有的decode解碼函數(shù),所以先變成byte類型哩陕,再使用decode解碼函數(shù)平项。
上面的示例是str類型的字符串赫舒,如果"\\u4e2d\\u56fd"
是b"\\u4e2d\\u56fd"
byte類型,則可以省去decode_byte = decode_str.encode()
這句語(yǔ)句闽瓢,直接decode解碼就可以拿到正確漢字了
更多課程接癌,點(diǎn)擊這里Spbeen-Python3教程