python編程的一大坑:python處理中文編碼和解碼中常見的亂碼問題

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編碼

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末袁辈,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子珠漂,更是在濱河造成了極大的恐慌晚缩,老刑警劉巖葛菇,帶你破解...
    沈念sama閱讀 217,084評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異橡羞,居然都是意外死亡眯停,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門卿泽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來莺债,“玉大人,你說我怎么就攤上這事签夭∑氚睿” “怎么了?”我有些...
    開封第一講書人閱讀 163,450評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵第租,是天一觀的道長(zhǎng)措拇。 經(jīng)常有香客問我,道長(zhǎng)慎宾,這世上最難降的妖魔是什么丐吓? 我笑而不...
    開封第一講書人閱讀 58,322評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮趟据,結(jié)果婚禮上券犁,老公的妹妹穿的比我還像新娘。我一直安慰自己汹碱,他們只是感情好粘衬,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評(píng)論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著咳促,像睡著了一般稚新。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上跪腹,一...
    開封第一講書人閱讀 51,274評(píng)論 1 300
  • 那天褂删,我揣著相機(jī)與錄音,去河邊找鬼尺迂。 笑死笤妙,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的噪裕。 我是一名探鬼主播蹲盘,決...
    沈念sama閱讀 40,126評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼膳音!你這毒婦竟也來了召衔?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,980評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤祭陷,失蹤者是張志新(化名)和其女友劉穎苍凛,沒想到半個(gè)月后趣席,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,414評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡醇蝴,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評(píng)論 3 334
  • 正文 我和宋清朗相戀三年宣肚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片悠栓。...
    茶點(diǎn)故事閱讀 39,773評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡霉涨,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出惭适,到底是詐尸還是另有隱情笙瑟,我是刑警寧澤,帶...
    沈念sama閱讀 35,470評(píng)論 5 344
  • 正文 年R本政府宣布癞志,位于F島的核電站往枷,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏凄杯。R本人自食惡果不足惜错洁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望盾舌。 院中可真熱鬧墓臭,春花似錦蘸鲸、人聲如沸妖谴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽膝舅。三九已至,卻和暖如春窑多,著一層夾襖步出監(jiān)牢的瞬間仍稀,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評(píng)論 1 269
  • 我被黑心中介騙來泰國打工埂息, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留技潘,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,865評(píng)論 2 370
  • 正文 我出身青樓千康,卻偏偏與公主長(zhǎng)得像享幽,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子拾弃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容