python中urllib.unquote亂碼的原因與解決方法
發(fā)現(xiàn)問題
Python中的urllib模塊用來處理url相關的操作,unquote方法對應javascript中的urldecode方法,它對url進行解碼,把類似"%xx"的字符替換成單個字符,例如:“%E6%B3%95%E5%9B%BD%E7%BA%A2%E9%85%92”解碼后會轉換成“法國紅酒”,但是使用過程中,如果姿勢不對,最終轉換出來的字符會是亂碼“法国红酔。
筆者在一個真實的Tornado應用中就遇到了這樣的問題,瀏覽器通過請求傳遞到后臺后,獲取參數(shù)的值后:
name = self.get_argument("name", "")
name = urllib.unquote(name)
# save to db
name的值打印出來的顯示的是:“%E6%B3%95%E5%9B%BD%E7%BA%A2%E9%85%92”,看起來沒什么問題,但結果最終保存到數(shù)據(jù)庫中的時候就成了一串亂碼“法国红酔,這個問題實在是讓人百思不得其解。
原因分析
于是想用直接編碼的字符來處理看看是否會出現(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)這種方式處理沒有任何問題,name的值解碼之后就是“法國紅酒”,經(jīng)過一番思考,原因只可能是出在self.get_argument("name")這處代碼段了。原來,get_argument默認返回的是值的類型是unicode,而unquote方法處理unicode類型的字符時,直接返回的就是:
u'\xe6\xb3\x95\xe5\x9b\xbd\xe7\xba\xa2\xe9\x85\x92'
注意:這里返回的值類型是unicode,也就是說unquote方法接收參數(shù)類型是unidoe,返回的值類型也是unicode,只不過是把"%"替換成了'\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"完全就是一個ascii碼字符串,只不過是用16進制表示的,我們再來看看'e6','b3'....分別對應ascii中的什么字符。你可以參考網(wǎng)址:http://www.ascii-code.com,'e6'是一個擴展的ascii字符,在128-255區(qū)間范圍內(nèi),他對應的符號就是'æ'
DEC OCT HEX BIN Symbol 230 346 E6 11100110 æ
現(xiàn)在你應該明白為什么會生成亂碼字符:
法国红é
解決辦法
在調(diào)用self.get_argument('name')方法之后,把返回的值轉換成str類型:
name = self.get_argument("name", "")
name = str(name)
name = urllib.unquote(name)
# save to db
轉換稱str類型的字符串之后,相當于調(diào)用:
'\xe6\xb3\x95\xe5\x9b\xbd\xe7\xba\xa2\xe9\x85\x92'.decode("utf-8")
>>> u'\u6cd5\u56fd\u7ea2\u9152'
總結
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者使用python能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關文章
利用Python通過獲取剪切板數(shù)據(jù)實現(xiàn)百度劃詞搜索功能
大家是不是嫌棄每次打開百度太麻煩?今天教大家利用Python通過獲取剪切板數(shù)據(jù)實現(xiàn)百度劃詞搜索功能,用程序直接打開網(wǎng)頁,需要的朋友可以參考下2021-06-06
總結python多進程multiprocessing的相關知識
今天給大家?guī)淼氖顷P于Python的相關知識,文章圍繞著python multiprocessing多進程的相關知識展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下2021-06-06
python,Django實現(xiàn)的淘寶客登錄功能示例
這篇文章主要介紹了python,Django實現(xiàn)的淘寶客登錄功能,結合實例形式分析了Django框架基于淘寶接口的登錄功能相關操作技巧,需要的朋友可以參考下2019-06-06
Python使用gluon/mxnet模塊實現(xiàn)的mnist手寫數(shù)字識別功能完整示例
這篇文章主要介紹了Python使用gluon/mxnet模塊實現(xiàn)的mnist手寫數(shù)字識別功能,結合完整實例形式分析了Python調(diào)用gluon/mxnet模塊識別手寫字的具體實現(xiàn)技巧,需要的朋友可以參考下2019-12-12

