国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

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

2020-02-23 04:36:46
字體:
供稿:網(wǎng)友

發(fā)現(xiàn)問題

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

筆者在一個(gè)真實(shí)的Tornado應(yīng)用中就遇到了這樣的問題,瀏覽器通過請求傳遞到后臺后,獲取參數(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”,看起來沒什么問題,但結(jié)果最終保存到數(shù)據(jù)庫中的時(shí)候就成了一串亂碼“法国红酔,這個(gè)問題實(shí)在是讓人百思不得其解。

原因分析

于是想用直接編碼的字符來處理看看是否會出現(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默認(rèn)返回的是值的類型是unicode,而unquote方法處理unicode類型的字符時(shí),直接返回的就是:

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"完全就是一個(gè)ascii碼字符串,只不過是用16進(jìn)制表示的,我們再來看看'e6','b3'....分別對應(yīng)ascii中的什么字符。你可以參考網(wǎng)址:http://www.ascii-code.com,'e6'是一個(gè)擴(kuò)展的ascii字符,在128-255區(qū)間范圍內(nèi),他對應(yīng)的符號就是'æ'

DEC OCT HEX BIN Symbol 230 346 E6 11100110 æ

現(xiàn)在你應(yīng)該明白為什么會生成亂碼字符:

法国红é

解決辦法

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

name = self.get_argument("name", "")name = str(name)name = urllib.unquote(name)# save to db

轉(zhuǎn)換稱str類型的字符串之后,相當(dāng)于調(diào)用:

'/xe6/xb3/x95/xe5/x9b/xbd/xe7/xba/xa2/xe9/x85/x92'.decode("utf-8")>>> u'/u6cd5/u56fd/u7ea2/u9152'            
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 延安市| 陇南市| 无锡市| 青岛市| 盐池县| 鄄城县| 长武县| 保康县| 金塔县| 土默特左旗| 晋城| 盐城市| 扶沟县| 建宁县| 舞钢市| 海宁市| 旅游| 仪陇县| 竹溪县| 建瓯市| 开远市| 泰来县| 县级市| 象州县| 通渭县| 峨边| 瓦房店市| 确山县| 汉川市| 静安区| 新野县| 和林格尔县| 抚远县| 惠水县| 隆回县| 石泉县| 龙游县| 全南县| 句容市| 高陵县| 二连浩特市|