久久96国产精品久久久-久久发布国产伦子伦精品-久久精品国产精品青草-久久天天躁夜夜躁狠狠85麻豆

技術員聯盟提供win764位系統下載,win10,win7,xp,裝機純凈版,64位旗艦版,綠色軟件,免費軟件下載基地!

當前位置:主頁 > 教程 > 服務器類 >

python中urllib.unquote亂碼的原因與解決方案

來源:技術員聯盟┆發布時間:2017-06-26 06:34┆點擊:

Python中的urllib模塊用來處理url相關的操作,unquote方法對應javascript中的urldecode方法,它對url進行解碼,把類似"%xx"的字符替換成單個字符,例如:“%E6%B3%95%E5%9B%BD%E7%BA%A2%E9%85%92”解碼后會轉換成“法國紅酒”,但是使用過程中,如果姿勢不對,最終轉換出來的字符會是亂碼“法国红酔。

筆者在一個真實的Tornado應用中就遇到了這樣的問題,瀏覽器通過請求傳遞到后臺后,獲取參數的值后:

1

2

3

 

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”,看起來沒什么問題,但結果最終保存到數據庫中的時候就成了一串亂碼“法国红酔,這個問題實在是讓人百思不得其解。

原因分析

于是想用直接編碼的字符來處理看看是否會出現亂碼:

1

2

3

 

name = '%E6%B3%95%E5%9B%BD%E7%BA%A2%E9%85%92'

name = urllib.unquote(name)

# save to db

 

發現這種方式處理沒有任何問題,name的值解碼之后就是“法國紅酒”,經過一番思考,原因只可能是出在self.get_argument("name")這處代碼段了。原來,get_argument默認返回的是值的類型是unicode,而unquote方法處理unicode類型的字符時,直接返回的就是:

1

 

u'\xe6\xb3\x95\xe5\x9b\xbd\xe7\xba\xa2\xe9\x85\x92'

 

注意:這里返回的值類型是unicode,也就是說unquote方法接收參數類型是unidoe,返回的值類型也是unicode,只不過是把"%"替換成了'\x',最終由:

1

 

u"%E6%B3%95%E5%9B%BD%E7%BA%A2%E9%85%92"

 

替換為了:

1

 

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中的什么字符。你可以參考網址:,'e6'是一個擴展的ascii字符,在128-255區間范圍內,他對應的符號就是'æ'

1

2

 

DEC OCT HEX BIN Symbol

230 346 E6 11100110 æ

 

現在你應該明白為什么會生成亂碼字符:

1

 

法国红é

 

解決辦法

在調用self.get_argument('name')方法之后,把返回的值轉換成str類型:

1

2

3

4

 

name = self.get_argument("name", "")

name = str(name)

name = urllib.unquote(name)

# save to db

 

轉換稱str類型的字符串之后,相當于調用:

1

2

3

 

'\xe6\xb3\x95\xe5\x9b\xbd\xe7\xba\xa2\xe9\x85\x92'.decode("utf-8")

 

>>> u'\u6cd5\u56fd\u7ea2\u9152'