編碼與解碼問題

編碼與解碼

對(duì)于我這樣的新手來說python2.x的編碼解碼問題真是個(gè)坑晴弃,什么decode,encode或油,好亂好亂寞忿,怎么辦呢,還是得自己搞懂的顶岸,這個(gè)世界你能靠的只有自己腔彰。
查了好多資料書籍,下面我試著來解釋一下辖佣,有可能有些偏差霹抛,但是會(huì)好理解一點(diǎn):

當(dāng)我們要向?qū)Ψ奖磉_(dá)某種意思的時(shí)候,就會(huì)用文字(當(dāng)然有其他方法)寫下來卷谈,當(dāng)對(duì)方看到文字的時(shí)候杯拐,就會(huì)明白我們要表達(dá)的意思。

把要表達(dá)的意思寫下來就是編碼世蔗,對(duì)方看到文字后端逼,會(huì)把通過眼睛接受的文字翻譯成意思,然后就明白了要表達(dá)的東西污淋,這就是解碼

對(duì)應(yīng)到Python中顶滩,“意思”就是unicode,文字就是str寸爆,因?yàn)槲淖钟兄形幕寤觯⑽模靼嘌勒Z等等而昨,所以str就會(huì)有utf-8,ascii等找田,

因此unicode通過encode就會(huì)變成str歌憨,str通過decode就會(huì)變成unicode,一般我們以“utf-8”編碼:unicode.encode('utf-8'),解碼:str.decode('utf-8')

那為什么我們經(jīng)常會(huì)遇到UnicodeEncodError:'ascii'code can't encode characters in position...呢:
這一般是發(fā)生在有中文的情況下墩衙,原因是當(dāng)需要對(duì)str類型的字符串進(jìn)行解碼操作時(shí)务嫡,python會(huì)自動(dòng)將其解碼為unicode甲抖,而默認(rèn)采用的是ascii來解碼,舉個(gè)例子:

>>>a = u'hello' + 'ysf'
>>>a
u'helloysf'

這是在終端輸入的代碼,其中u‘hello’是unicode類型心铃,‘ysf’是str類型准谚,但是進(jìn)行python在處理u'hello' + 'ysf'時(shí)卻沒有報(bào)錯(cuò),最后還返回了u'helloysf'去扣,這是為什么呢柱衔?原因就在于python內(nèi)部先做了一步‘ysf’.decode('ascii'),將str類型解碼成了unicode類型,這在沒有中文的情況下是沒錯(cuò)的愉棱,但是當(dāng)有中文的時(shí)候唆铐,就有問題了,如下:

>>>a = u'hello' + '中文'
Traceback (most recent call last):
  File "<input>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128) 

這是python在內(nèi)部進(jìn)行‘中文’.decode(‘a(chǎn)scii’)解碼時(shí)出錯(cuò)了奔滑,因?yàn)閍scii編碼不包含中文艾岂,因此無法解碼。按照如下方法改就不出錯(cuò)了

>>>a = u'hello' + '中文'.decode('utf-8')
>>>a
u'hello\u4e2d\u6587'

或者把系統(tǒng)默認(rèn)編碼方式改為‘utf-8’,如下朋其,也就不會(huì)出錯(cuò)了

>>>import sys
>>>reload(sys)
<module 'sys' (built-in)>
>>>sys.setdefaultencoding('utf-8')
>>>a = u'hello' + '中文'
>>>a
u'hello\u4e2d\u6587'

最后在提一下王浴,當(dāng)源代碼寫在腳本文件中時(shí),我們一般會(huì)用# -- coding:utf-8 --去申明梅猿,而且要保存為utf-8編碼氓辣,這樣子Python解釋器會(huì)按照‘utf-8’方式讀取源代碼,讀取后粒没,會(huì)轉(zhuǎn)換為Unicode字符到內(nèi)存里筛婉,編輯完成后,保存時(shí)在轉(zhuǎn)換為‘utf-8’癞松,因此如果要寫入文件中爽撒,就要用encode(‘utf-8’)編碼成utf-8類型。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末响蓉,一起剝皮案震驚了整個(gè)濱河市硕勿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌枫甲,老刑警劉巖源武,帶你破解...
    沈念sama閱讀 222,627評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異想幻,居然都是意外死亡粱栖,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門脏毯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來闹究,“玉大人,你說我怎么就攤上這事食店≡伲” “怎么了赏寇?”我有些...
    開封第一講書人閱讀 169,346評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)价认。 經(jīng)常有香客問我嗅定,道長(zhǎng),這世上最難降的妖魔是什么用踩? 我笑而不...
    開封第一講書人閱讀 60,097評(píng)論 1 300
  • 正文 為了忘掉前任渠退,我火速辦了婚禮,結(jié)果婚禮上捶箱,老公的妹妹穿的比我還像新娘智什。我一直安慰自己,他們只是感情好丁屎,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,100評(píng)論 6 398
  • 文/花漫 我一把揭開白布荠锭。 她就那樣靜靜地躺著,像睡著了一般晨川。 火紅的嫁衣襯著肌膚如雪证九。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,696評(píng)論 1 312
  • 那天共虑,我揣著相機(jī)與錄音愧怜,去河邊找鬼。 笑死妈拌,一個(gè)胖子當(dāng)著我的面吹牛拥坛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播尘分,決...
    沈念sama閱讀 41,165評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼猜惋,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了培愁?” 一聲冷哼從身側(cè)響起著摔,我...
    開封第一講書人閱讀 40,108評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎定续,沒想到半個(gè)月后谍咆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,646評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡私股,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,709評(píng)論 3 342
  • 正文 我和宋清朗相戀三年摹察,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片倡鲸。...
    茶點(diǎn)故事閱讀 40,861評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡港粱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情查坪,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布宁炫,位于F島的核電站偿曙,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏羔巢。R本人自食惡果不足惜望忆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,196評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望竿秆。 院中可真熱鬧启摄,春花似錦、人聲如沸幽钢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽匪燕。三九已至蕾羊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間帽驯,已是汗流浹背龟再。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留尼变,地道東北人利凑。 一個(gè)月前我還...
    沈念sama閱讀 49,287評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像嫌术,于是被迫代替她去往敵國(guó)和親哀澈。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,860評(píng)論 2 361

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