发现问题
Python中的urllib模块用来处理url相关的操作,unquote方法对应javascript中的urldecode方法,它对url进行解码,把类似"%xx"的字符替换成单个字符,例如:“法国红酒”解码后会转换成“法国红酒”,但是使用过程中,如果姿势不对,最终转换出来的字符会是乱码“法国红酔。
笔者在一个FLASK应用中就遇到了这样的问题,浏览器通过AJAX请求传递到后台后,由于其参数的值的特殊性,故做了urlencode处理,然而到后台进行处理,总是出现类似于:"法国红é…"的乱码:
request.values.get('content')默认返回的是值的类型是unicode,而unquote方法处理unicode类型的字符时,直接返回的就是:
u'\xe6\xb3\x95\xe5\x9b\xbd\xe7\xba\xa2\xe9\x85\x92'
注意:这里返回的值类型是unicode,也就是说unquote方法接收参数类型是unidoe,返回的值类型也是unicode,只不过是把"%"替换成了'\x',最终由:
u"法国红酒"
替换为了:
u"\xe6\xb3\x95\xe5\x9b\xbd\xe7\xba\xa2\xe9\x85\x92"
解决办法:
content = str(request.values.get('content'))
if sys.version_info > (3, 0):
print('3')
content = urllib.parse.unquote(content, encoding='utf-8', errors='replace')
else:
print('2')
content = urllib.unquote(content)