'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)

Python 里面的編碼和解碼也就是 unicode 和 str 這兩種形式的相互轉(zhuǎn)化.

  • 編碼是 unicode -> str棺耍,相反的桐玻,解碼就 是 str -> unicode

  • 剩下的問題就是確定何時需要進(jìn)行編碼或者解碼了.

  • 關(guān)于文件開頭的"編碼指示"忧设,也就是 # -*- coding: -*- 這個語句锄开。Python 默認(rèn)腳本文件都是 UTF-8 編碼的梳猪,當(dāng)文件中有非 UTF-8 編碼范圍內(nèi)的字符的時候就要使用"編碼指示"來修正. 關(guān)于 sys.defaultencoding彩扔,這個在解碼沒有明確指明解碼方式的時候使用妆档。比如我有如下代碼:

#! /usr/bin/env python   
# -*- coding: utf-8 -*-   
s = '中文'  # 注意這里的 str 是 str 類型的,而不是 unicode   
s.encode('gb18030')   
  • 這句代碼將 s 重新編碼為 gb18030的格式虫碉,即進(jìn)行unicode -> str的轉(zhuǎn)換贾惦。因?yàn)?s 本身就是 str類型的,因此 Python 會自動的先將 s 解碼為 unicode 敦捧,然后再編碼成 gb18030须板。因?yàn)榻獯a是python自動進(jìn)行的,我們沒有指明解碼方式兢卵,python 就會使用 sys.defaultencoding指明的方式來解碼习瑰。很多情況下 sys.defaultencoding 是 ANSCII,如果 s 不是這個類型就會出錯秽荤。

  • 拿上面的情況來說甜奄,我的 sys.defaultencodinganscii,而 s 的編碼方式和文件的編碼方式一致窃款,是 utf8 的课兄,所以出錯了: __UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128) __

在解決錯誤之前,首先要了解unicode和utf-8的區(qū)別晨继。

  1. unicode指的是萬國碼烟阐,是一種“字碼表”。而utf-8是這種字碼表儲存的編碼方法。unicode不一定要由utf-8這種方式編成bytecode儲存蜒茄,也可以使用utf-16,utf-7等其他方式唉擂。目前大多都以utf-8的方式來變成bytecode

  2. python中字符串類型分為byte stringunicode string兩種扩淀。

  3. 如果在python文件中指定編碼方式為utf-8(#coding=utf-8)楔敌,那么所有帶中文的字符串都會被認(rèn)為是utf-8編碼的byte string(例如:mystr="你好"),但是在函數(shù)中所產(chǎn)生的字符串則被認(rèn)為是unicode string
    問題就出在這邊驻谆,unicode stringbyte string是不可以混合使用的卵凑,一旦混合使用了,就會產(chǎn)生這樣的錯誤胜臊。例如:

    self.response.out.write("你好"+self.request.get("argu"))

    其中,"你好"被認(rèn)為是byte string勺卢,而self.request.get("argu")的返回值被認(rèn)為是unicode string。由于預(yù)設(shè)的解碼器是ascii象对,所以就不能識別中文byte string黑忱。然后就報(bào)錯了。

以下有兩個解決方法:

  • 第一種,是明確的指示出 s 的編碼方式

    #! /usr/bin/env python 
    # -*- coding: utf-8 -*- 
    s = '中文' 
    s.decode('utf-8').encode('gb18030') 
    
  • 第二種,更改sys.defaultencoding為文件的編碼方式

#! /usr/bin/env python 
# -*- coding: utf-8 -*- 
import sys #要重新載入sys勒魔。因?yàn)?Python 初始化后會刪除 sys.setdefaultencoding 這個方 法
reload(sys) 
sys.setdefaultencoding('utf-8') 

總結(jié)一下為什么要這么寫的原因:
1. 當(dāng)取回來的數(shù)據(jù)與你當(dāng)前腳本中聲明的編碼不一致時就要做編碼轉(zhuǎn)換
2.在編碼轉(zhuǎn)換時首先要將該數(shù)據(jù)以自身編碼的格式換成unicode碼,再將這個unicode按utf8編碼
3.為什么我的瀏覽器會傳回gb2312的編碼數(shù)據(jù)到服務(wù)器,這應(yīng)該和客戶端的系統(tǒng)編碼有關(guān)系


參考網(wǎng)址
http://blog.csdn.net/a657941877/article/details/9063883
http://wklken.me/posts/2013/08/31/python-extra-coding-intro.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末甫煞,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子冠绢,更是在濱河造成了極大的恐慌抚吠,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件弟胀,死亡現(xiàn)場離奇詭異杉适,居然都是意外死亡吁断,警方通過查閱死者的電腦和手機(jī)笆包,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進(jìn)店門憾股,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人夏哭,你說我怎么就攤上這事检柬。” “怎么了竖配?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵厕吉,是天一觀的道長。 經(jīng)常有香客問我械念,道長头朱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任龄减,我火速辦了婚禮项钮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己烁巫,他們只是感情好署隘,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著亚隙,像睡著了一般磁餐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上阿弃,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天诊霹,我揣著相機(jī)與錄音,去河邊找鬼渣淳。 笑死脾还,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的入愧。 我是一名探鬼主播鄙漏,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼棺蛛!你這毒婦竟也來了怔蚌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤旁赊,失蹤者是張志新(化名)和其女友劉穎桦踊,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體彤恶,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年鳄橘,在試婚紗的時候發(fā)現(xiàn)自己被綠了声离。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡瘫怜,死狀恐怖术徊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鲸湃,我是刑警寧澤赠涮,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站暗挑,受9級特大地震影響笋除,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜炸裆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一垃它、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦国拇、人聲如沸洛史。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽也殖。三九已至,卻和暖如春务热,著一層夾襖步出監(jiān)牢的瞬間忆嗜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工陕习, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留霎褐,地道東北人。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓该镣,卻偏偏與公主長得像冻璃,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子损合,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評論 2 355

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

  • 字符集和編碼簡介 在編程中常呈⊙蓿可以見到各種字符集和編碼,包括ASCII,MBCS,Unicode等字符集嫁审。確切的說...
    蘭山小亭閱讀 8,494評論 0 13
  • 說明:本文是我在readthedocs看到的跋炕,覺得很不錯所以轉(zhuǎn)載過來,有刪改律适,原文地址點(diǎn)這里辐烂。 實(shí)用Unicode...
    aurora閱讀 981評論 0 6
  • 個人筆記,方便自己查閱使用 Py.LangSpec.Contents Refs Built-in Closure ...
    freenik閱讀 67,711評論 0 5
  • 風(fēng)雨里捂贿,樹枝顫了幾下纠修,那是梧桐,道邊多得是厂僧。寒露過后是霜降扣草,這樣的風(fēng)雨持續(xù)下去,估計(jì)到重陽梧桐就剩不了幾片葉子了颜屠。...
    風(fēng)言無語閱讀 410評論 14 29
  • 相信自己的——鑫 此鑫為呂家小伙兒辰妙,無意中得知鑫和大姐家的外甥年齡相仿,原來是媽媽老年得子甫窟,一定是寵得不得了...
    靜心_靜語閱讀 336評論 0 2