python中urllib.unquote亂碼的原因與解決方法
發(fā)現(xiàn)問(wèn)題
Python中的urllib模塊用來(lái)處理url相關(guān)的操作,unquote方法對(duì)應(yīng)javascript中的urldecode方法,它對(duì)url進(jìn)行解碼,把類(lèi)似"%xx"的字符替換成單個(gè)字符,例如:“%E6%B3%95%E5%9B%BD%E7%BA%A2%E9%85%92”解碼后會(huì)轉(zhuǎn)換成“法國(guó)紅酒”,但是使用過(guò)程中,如果姿勢(shì)不對(duì),最終轉(zhuǎn)換出來(lái)的字符會(huì)是亂碼“法国红酔。
筆者在一個(gè)真實(shí)的Tornado應(yīng)用中就遇到了這樣的問(wèn)題,瀏覽器通過(guò)請(qǐng)求傳遞到后臺(tái)后,獲取參數(shù)的值后:
name = self.get_argument("name", "")
name = urllib.unquote(name)
# save to db
name的值打印出來(lái)的顯示的是:“%E6%B3%95%E5%9B%BD%E7%BA%A2%E9%85%92”,看起來(lái)沒(méi)什么問(wèn)題,但結(jié)果最終保存到數(shù)據(jù)庫(kù)中的時(shí)候就成了一串亂碼“法国红酔,這個(gè)問(wèn)題實(shí)在是讓人百思不得其解。
原因分析
于是想用直接編碼的字符來(lái)處理看看是否會(huì)出現(xiàn)亂碼:
name = '%E6%B3%95%E5%9B%BD%E7%BA%A2%E9%85%92' name = urllib.unquote(name) # save to db
發(fā)現(xiàn)這種方式處理沒(méi)有任何問(wèn)題,name的值解碼之后就是“法國(guó)紅酒”,經(jīng)過(guò)一番思考,原因只可能是出在self.get_argument("name")這處代碼段了。原來(lái),get_argument默認(rèn)返回的是值的類(lèi)型是unicode,而unquote方法處理unicode類(lèi)型的字符時(shí),直接返回的就是:
u'\xe6\xb3\x95\xe5\x9b\xbd\xe7\xba\xa2\xe9\x85\x92'
注意:這里返回的值類(lèi)型是unicode,也就是說(shuō)unquote方法接收參數(shù)類(lèi)型是unidoe,返回的值類(lèi)型也是unicode,只不過(guò)是把"%"替換成了'\x',最終由:
u"%E6%B3%95%E5%9B%BD%E7%BA%A2%E9%85%92"
替換為了:
u"\xe6\xb3\x95\xe5\x9b\xbd\xe7\xba\xa2\xe9\x85\x92"
而u"\xe6\xb3\x95\xe5\x9b\xbd\xe7\xba\xa2\xe9\x85\x92"完全就是一個(gè)ascii碼字符串,只不過(guò)是用16進(jìn)制表示的,我們?cè)賮?lái)看看'e6','b3'....分別對(duì)應(yīng)ascii中的什么字符。你可以參考網(wǎng)址:http://www.ascii-code.com,'e6'是一個(gè)擴(kuò)展的ascii字符,在128-255區(qū)間范圍內(nèi),他對(duì)應(yīng)的符號(hào)就是'æ'
DEC OCT HEX BIN Symbol 230 346 E6 11100110 æ
現(xiàn)在你應(yīng)該明白為什么會(huì)生成亂碼字符:
法国红é
解決辦法
在調(diào)用self.get_argument('name')方法之后,把返回的值轉(zhuǎn)換成str類(lèi)型:
name = self.get_argument("name", "")
name = str(name)
name = urllib.unquote(name)
# save to db
轉(zhuǎn)換稱(chēng)str類(lèi)型的字符串之后,相當(dāng)于調(diào)用:
'\xe6\xb3\x95\xe5\x9b\xbd\xe7\xba\xa2\xe9\x85\x92'.decode("utf-8")
>>> u'\u6cd5\u56fd\u7ea2\u9152'
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者使用python能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
python實(shí)現(xiàn)簡(jiǎn)單的超市商品銷(xiāo)售管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)超市商品銷(xiāo)售管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11
Window版下在Jupyter中編寫(xiě)TensorFlow的環(huán)境搭建
這篇文章主要介紹了Window版下在Jupyter中編寫(xiě)TensorFlow的環(huán)境搭建,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04
Python手繪可視化工具cutecharts使用實(shí)例
這篇文章主要介紹了Python手繪可視化工具cutecharts使用實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12
Python中靜態(tài)方法,類(lèi)方法,屬性方法使用方法
這篇文章主要介紹了Python中靜態(tài)方法,類(lèi)方法,屬性方法使用方法,文章圍繞主題的相關(guān)資料展開(kāi)詳細(xì)內(nèi)容,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-05-05
使用Python的Turtle繪制哆啦A夢(mèng)實(shí)例
今天小編就為大家分享一篇使用Python的Turtle繪制哆啦A夢(mèng)實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11
win7下 python3.6 安裝opencv 和 opencv-contrib-python解決 cv2.xfeat
這篇文章主要介紹了win7下 python3.6 安裝opencv 和 opencv-contrib-python解決 cv2.xfeatures2d.SIFT_create() 的問(wèn)題,需要的朋友可以參考下2019-10-10
Python中Matplotlib繪圖保存圖片時(shí)調(diào)節(jié)圖形清晰度或分辨率的方法
有時(shí)我們?cè)谑褂胢atplotlib作圖時(shí),圖片不清晰或者圖片大小不是我們想要的,這篇文章主要給大家介紹了關(guān)于Python中Matplotlib繪圖保存圖片時(shí)調(diào)節(jié)圖形清晰度或分辨率的相關(guān)資料,需要的朋友可以參考下2024-05-05
Python基于Flask框架配置依賴(lài)包信息的項(xiàng)目遷移部署
這篇文章主要介紹了Python基于Flask框架配置依賴(lài)包信息的項(xiàng)目遷移部署小技巧,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2018-03-03
Python 實(shí)現(xiàn)敏感目錄掃描的示例代碼
這篇文章主要介紹了Python 實(shí)現(xiàn)敏感目錄掃描的示例代碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05

