unicode
ascii默認(rèn)八位存一位,而unicode默認(rèn)是16位存一個(gè)宅荤,所有英文用ascii都是8位,但是使用unicode都是16位,于是出現(xiàn)了一個(gè)unicode的擴(kuò)展集摔蓝,utf-8,可變長(zhǎng)的愉耙,所有的英文還是按照ascii存儲(chǔ)贮尉,一個(gè)字節(jié),所有的中文全部三個(gè)字節(jié)朴沿,可以簡(jiǎn)單的把unicode看成所有編碼集的大家長(zhǎng)猜谚,它包含一切败砂,任何編碼集都可以在它中找到。
python2
在python2中默認(rèn)的編碼格式是ascii魏铅,此時(shí)str=“你好”昌犹,那么這個(gè)你好是ascii編碼,會(huì)報(bào)錯(cuò)览芳,而且當(dāng)encode()不指定參數(shù)的時(shí)候也是默認(rèn)先用ascii編碼碼的斜姥,在python2上寫# -*- coding: utf-8 -*-的意思是該程序使用utf-8編碼,這樣str=“你好”沧竟,那么就是utf-8編碼的了铸敏,但是encode()不指定參數(shù)的時(shí)候,默認(rèn)也是使用ascii編碼的
注:想學(xué)習(xí)Python的小伙伴們
可以
進(jìn)群:984137898
領(lǐng)取從0到1完整學(xué)習(xí)資料 視頻? 精品書籍 一個(gè)月經(jīng)典筆記和99道練習(xí)題及答案
python3
而在python3中默認(rèn)的編碼格式是unicode悟泵,這個(gè)這樣理解杈笔,當(dāng)我們?cè)诔绦蛑衧tr=“你好”這個(gè)str是unicode編碼的,當(dāng)我們encode()沒有指定編碼集的時(shí)候糕非,這個(gè)encode是按照utf-8進(jìn)行編碼的蒙具。而python3上寫#-*- coding: gbk -*-意思是該程序使用gbk編碼,但是str=“你好”依然是unicode編碼的朽肥,而且encode()沒有指定編碼集的時(shí)候禁筏,這個(gè)encode是按照utf-8進(jìn)行編碼的。所以個(gè)人認(rèn)為在python3的時(shí)候衡招,頁面編碼使用gbk沒有任何意義
該方法輸出當(dāng)前默認(rèn)的編碼
python3輸出utf-8篱昔,但它的默認(rèn)編碼格式是unicode
以下代碼使用python2級(jí)版本
python2中該程序在str.encode()之前會(huì)默認(rèn)按照ascii解碼有一部隱式操作(python3中沒有,因?yàn)橐婚_始就是unicode編碼的)蚁吝,雖然有(# -*- coding: utf-8 -*-)旱爆,所以中文用ascii解碼當(dāng)然會(huì)出問題了,解決辦法就是手動(dòng)進(jìn)行解碼窘茁,這樣就不會(huì)用ascii解碼了
該程序沒有出問題是因?yàn)槭謩?dòng)使用了utf-8進(jìn)行了解碼怀伦,這樣在解碼的時(shí)候就不會(huì)有一個(gè)隱形的ascii解碼了,str因?yàn)?b># -*- coding: utf-8 -*-所以默認(rèn)使用utf-8編碼山林,用utf-8進(jìn)行解碼str1此時(shí)是unicode房待,unicode可以正常顯示中文的,再用utf-8進(jìn)行編碼還是你好
將utf-8編碼的str轉(zhuǎn)成gbk編碼的
按照道理來說unicode是大家長(zhǎng)驼抹,編碼成gbk也應(yīng)該是沒有問題的桑孩,那為何輸出亂碼呢?
其實(shí)編碼成gbk這一步?jīng)]有任何問題框冀,問題出在了控制臺(tái)顯示的編碼上流椒,因?yàn)槲业膒ycharm編碼為utf-8,所以u(píng)tf-8直接解碼gbk肯定會(huì)出問題明也,所以,把pycharm的編碼改成gbk就ok了
將剛才的gbk轉(zhuǎn)成utf-8
編碼和解碼
演示完這兩個(gè)之后,因?yàn)閡nicode可以看成大家長(zhǎng)寄症,所以中文可以在兩種編碼之間進(jìn)行轉(zhuǎn)換時(shí),可以使用unicode來進(jìn)行過渡蜻势,一種編碼先解碼成unicode,再編碼成另一種編碼
這個(gè)圖說明只能unicode編碼成其它鹉胖,其它解碼成unicode
因?yàn)? -*- coding: utf-8 -*-,所以str=“你好”將會(huì)默認(rèn)使用utf-8進(jìn)行編碼
也可以str=u“你好”
前面使用u握玛,所以表示你好使用uncicode編碼,輸出也會(huì)正常輸出中文甫菠,因?yàn)閡nicode包含一切
以上都是在2級(jí)版本的講解挠铲,
其實(shí)所有版本兩種編碼的轉(zhuǎn)換都一樣,就是通過unicode進(jìn)行轉(zhuǎn)換淑蔚,所以其它兩種編碼(不只是utf-8和gbk)都是按照unicode做中間轉(zhuǎn)換的思想去轉(zhuǎn)換
在python3中默認(rèn)的編碼格式是unicode市殷,這個(gè)這樣理解愕撰,當(dāng)我們?cè)诔绦蛑衧tr=“你好”這個(gè)str是unicode編碼的刹衫,當(dāng)我們encode()沒有指定編碼集的時(shí)候,這個(gè)encode是按照utf-8進(jìn)行編碼的搞挣。
在python3中程序的默認(rèn)編碼unicode
所以在python3中只要str=“你好”那么這個(gè)你好默認(rèn)是unicode進(jìn)行編碼
可以對(duì)其進(jìn)行編碼带迟,編成gbk
python3編碼其實(shí)有兩個(gè)過程,一個(gè)是編碼utf-8囱桨,gbk這樣的仓犬,一個(gè)是編碼成子節(jié)數(shù)組,所以下面輸出了編碼成gbk的自節(jié)數(shù)組舍肠,同理解碼也有兩個(gè)過程是和它相反的
下面程序搀继,你好是unicode編碼,所以可以方便的將其編碼成gbk翠语,不會(huì)出問題
可以看輸出結(jié)果叽躯,第一輸出的是gbk編碼的了,第二輸出的是編碼好的子節(jié)數(shù)組
右下角這個(gè)是該文件的編碼格式肌括,個(gè)人感覺沒什么用点骑,因?yàn)樵趐ython2為了輸入中文,我們必須要指定#-*- coding: 編碼 -*-谍夭,這樣右下角這個(gè)文件編碼會(huì)根據(jù)#-*- coding: 編碼 -*-而變化
這個(gè)在python3中如果右下角是gbk黑滴,那么就一定要寫一句# -*- coding: gbk -*-不然會(huì)出問題,但是即使寫了也沒有任何效果在python3中無論是寫# -*- coding: utf-8 -*-還是# -*- coding: gbk -*-都不會(huì)有效果紧索,str=“你好”依然是unicode編碼