python---字符編碼問(wèn)題

問(wèn)題

最近在用python 2.7寫代碼的時(shí)候叙赚,遇到一個(gè)老生常談的小坑----- ** 字符編碼 **

import MySQLdb
conn = MySQLdb.connect(host=..., user=..., passwd=..., db=..., charset='utf8', port=...)  //此處已設(shè)置charset為utf8

從數(shù)據(jù)庫(kù)獲取到的數(shù)據(jù)是:value = '\u6295\u8d44梨水。挤茄。。冰木。穷劈。' ** 注意:前面沒(méi)有u **
然后在django后端views.py中,

from django.http import JsonResponse

用JsonResponse(value)返回?cái)?shù)據(jù)踊沸,前端進(jìn)行渲染歇终,結(jié)果在頁(yè)面上不顯示返回結(jié)果。

排查過(guò)程

  • 打開chrome的console調(diào)試逼龟,發(fā)現(xiàn)報(bào)錯(cuò)500--Internal Server Error评凝。。腺律。
  • 查看log發(fā)現(xiàn)出現(xiàn)兩種報(bào)錯(cuò):'utf8' codec can't decode bytes in position 3-4: invalid continuation byte 和 'ascii' codec can't decode byte 0xe4 in position 0
  • views.py的開頭奕短,已經(jīng)指定了utf-8顯示:
# -*- encoding: utf-8 -*-
importsyswufazhengquejiexi
reload(sys)
sys.setdefaultencoding('utf-8')

調(diào)試(工具為ipython)

查看變量value的類型,可見value并不是unicode類型匀钧,而是str類型

分析

首先我們看下在python中翎碑,unicode 和 utf-8/gb2312/ascii 的區(qū)別 (參照百度百科)

  • unicode :在python中是一個(gè)類,函數(shù)unicode(str,"utf8")之斯,將utf8編碼(或其他編碼)的字符串str轉(zhuǎn)換為unicode類的對(duì)象日杈。它表示一個(gè)變量的類型,可以用isinstance(value, unicode)來(lái)查看value變量是否為unicode格式的字符佑刷。
  • ascii :是一種字符集莉擒,包括大小寫的英文字母、數(shù)字瘫絮、控制字符等涨冀,翻譯為美國(guó)信息互換標(biāo)準(zhǔn)代碼,是美國(guó)國(guó)家標(biāo)準(zhǔn)學(xué)會(huì)(ANSI)制定的英文編碼麦萤。
  • gb2312:國(guó)標(biāo)碼鹿鳖,是對(duì) ASCII 的中文擴(kuò)展
  • utf-8:是一種針對(duì)unicode的可變長(zhǎng)度字符編碼扁眯,它是在互聯(lián)網(wǎng)上使用最廣的一種unicode的實(shí)現(xiàn)方式,是為傳輸而設(shè)計(jì)的編碼栓辜,并使編碼無(wú)國(guó)界,這樣就可以顯示全世界上所有文化的字符了
  • gb2312和utf-8都是按照unicode規(guī)定的方式垛孔,用不同的編碼排列方式藕甩,將字符與二進(jìn)制的01進(jìn)行對(duì)應(yīng)的表。

然后我們研究下python中的encode和decode函數(shù):

unicode_1 = u'中文'
str_1 = unicode_1.encode('gb2312')

將unicode對(duì)象unicode_1用gb2312編碼周荐,得到str類型變量str_1狭莱,結(jié)果見圖:


unicode_2 = str_1.decode('gb2312')

用gb2312編碼對(duì)字符串str_gb進(jìn)行解碼,得到unicode類型對(duì)象概作,結(jié)果見圖:

decode()和encode()關(guān)系如圖:


解決辦法

現(xiàn)在回到我們的問(wèn)題中腋妙,查看了一下mysql數(shù)據(jù)庫(kù),發(fā)現(xiàn)里面存儲(chǔ)的數(shù)據(jù)確實(shí)是utf-8格式讯榕,因此用網(wǎng)上搜到的方法

value = value.decode('gb2312').encode('utf-8')

來(lái)修改代碼骤素,前端仍然不顯示。這里是因?yàn)閿?shù)據(jù)庫(kù)里存儲(chǔ)的并非gb2312格式的數(shù)據(jù)愚屁,所以decode是沒(méi)用的济竹。
再查,發(fā)現(xiàn)產(chǎn)生 ‘XXX' codec can't decode bytes in position XX 這種錯(cuò)誤信息的真正原因霎槐,竟然是decode過(guò)程中遇到了非法字符送浊,因此無(wú)法正確解碼(參照:blog.csdn.net/cnmilan/article/details/9264643)。
而在做decode時(shí)丘跌,加上ignore參數(shù)袭景,則會(huì)忽略非法字符:

value = value.decode('utf-8', 'ignore').encode('utf-8')

至此,問(wèn)題得到解決闭树。

總結(jié)

一定要真正理解unicode和utf-8的區(qū)別耸棒,還有要梳理清楚decode()和encode()的關(guān)系,排查出問(wèn)題的真正原因报辱,而不是隨便在網(wǎng)上搜索模糊的答案榆纽,一來(lái)未必能真正解決問(wèn)題,二來(lái)永遠(yuǎn)不會(huì)進(jìn)步捏肢!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末奈籽,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子鸵赫,更是在濱河造成了極大的恐慌衣屏,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,843評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辩棒,死亡現(xiàn)場(chǎng)離奇詭異狼忱,居然都是意外死亡膨疏,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門钻弄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)佃却,“玉大人,你說(shuō)我怎么就攤上這事窘俺∷撬В” “怎么了?”我有些...
    開封第一講書人閱讀 163,187評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵瘤泪,是天一觀的道長(zhǎng)灶泵。 經(jīng)常有香客問(wèn)我,道長(zhǎng)对途,這世上最難降的妖魔是什么赦邻? 我笑而不...
    開封第一講書人閱讀 58,264評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮实檀,結(jié)果婚禮上惶洲,老公的妹妹穿的比我還像新娘。我一直安慰自己膳犹,他們只是感情好湃鹊,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,289評(píng)論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著镣奋,像睡著了一般币呵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上侨颈,一...
    開封第一講書人閱讀 51,231評(píng)論 1 299
  • 那天余赢,我揣著相機(jī)與錄音,去河邊找鬼哈垢。 笑死妻柒,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的耘分。 我是一名探鬼主播举塔,決...
    沈念sama閱讀 40,116評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼求泰!你這毒婦竟也來(lái)了央渣?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,945評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤渴频,失蹤者是張志新(化名)和其女友劉穎芽丹,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體卜朗,經(jīng)...
    沈念sama閱讀 45,367評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拔第,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,581評(píng)論 2 333
  • 正文 我和宋清朗相戀三年咕村,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蚊俺。...
    茶點(diǎn)故事閱讀 39,754評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡懈涛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出泳猬,到底是詐尸還是另有隱情批钠,我是刑警寧澤,帶...
    沈念sama閱讀 35,458評(píng)論 5 344
  • 正文 年R本政府宣布暂殖,位于F島的核電站价匠,受9級(jí)特大地震影響当纱,放射性物質(zhì)發(fā)生泄漏呛每。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,068評(píng)論 3 327
  • 文/蒙蒙 一坡氯、第九天 我趴在偏房一處隱蔽的房頂上張望晨横。 院中可真熱鬧,春花似錦箫柳、人聲如沸手形。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,692評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)库糠。三九已至,卻和暖如春涮毫,著一層夾襖步出監(jiān)牢的瞬間瞬欧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,842評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工罢防, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留艘虎,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,797評(píng)論 2 369
  • 正文 我出身青樓咒吐,卻偏偏與公主長(zhǎng)得像野建,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子恬叹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,654評(píng)論 2 354

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

  • 字符集和編碼簡(jiǎn)介 在編程中常澈蛏可以見到各種字符集和編碼,包括ASCII,MBCS,Unicode等字符集绽昼。確切的說(shuō)...
    蘭山小亭閱讀 8,488評(píng)論 0 13
  • 幾個(gè)基本概念 bit二進(jìn)制位陶舞, 是計(jì)算機(jī)內(nèi)部數(shù)據(jù)儲(chǔ)存的最小單位,11010100是一個(gè)8位二進(jìn)制數(shù)绪励。一個(gè)二進(jìn)制位只...
    西電大俠閱讀 3,570評(píng)論 1 8
  • 本文專治各種python字符編碼問(wèn)題疑難雜癥肿孵。 標(biāo)準(zhǔn)動(dòng)作 在腳本第一行指定編碼格式: 將默認(rèn)的ascii字符流處理...
    m2fox閱讀 1,354評(píng)論 0 1
  • 可以看我的博客 lmwen.top 或者訂閱我的公眾號(hào) 簡(jiǎn)介有稍微接觸python的人就會(huì)知道唠粥,python中...
    ayuLiao閱讀 3,113評(píng)論 1 5
  • 編碼問(wèn)題一直困擾著開發(fā)人員,尤其在 Java 中更加明顯停做,因?yàn)?Java 是跨平臺(tái)語(yǔ)言晤愧,不同平臺(tái)之間編碼之間的切換...
    x360閱讀 2,478評(píng)論 1 20