作者:忘了呼吸的那只猫
发表于:2020.04.04 14:51:55
链接:https://www.jianshu.com/p/9c87139332a0
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
在编写网络应用的时候难免会使用URL传递一些关键词,有些关键词是中文,就会出现编码问题:
例如:https://www.baidu.com/s?ie=UTF-8&wd=%E4%B8%AD%E5%9B%BD%E4%BA%BA
实际的内容是:https://www.baidu.com/s?ie=UTF-8&wd=中国人
关于URL网址链接中的中文编码与解码这里有两种思路仅供产考:
1. 通过字符串处理的方式获取被编码的16进制字符串,再进行解码获取到可识别的汉字
获得一个16进制表示的字符串,它的type是str,可以使用eval
函数将其转化为二进制,
上代码:
url_s = '%E4%B8%AD%E5%9B%BD%E4%BA%BA' # URL中被编码的部分
s = url_s.replace('%',r'\x')
b = eval('b' + '\'' + s + '\'') # 注意这里都是单引号
print(s)
print(b)
print(type(s))
print(type(b))
print(b.decode('utf-8'))
输出为:
'\\xE4\\xB8\\xAD\\xE5\\x9B\\xBD\\xE4\\xBA\\xBA'
b'\xe4\xb8\xad\xe5\x9b\xbd\xe4\xba\xba'
<class 'str'>
<class 'bytes'>
中国人
这种方法利用简单的字符串处理和编码,通常开发中使用封装好的方法。
2. 使用urllib库中的方法,其他库也有不做多说,只提供思路
from urllib.request import quote, unquote
# 编码
url1 = "https://www.baidu.com/s?wd=中国"
# utf8编码,指定安全字符
ret1 = quote(url1, safe=";/?:@&=+$,", encoding="utf-8")
print(ret1)
# 结果: https://www.baidu.com/s?wd=%E4%B8%AD%E5%9B%BD
# 解码
url2 = "https://www.baidu.com/s?wd=%E4%B8%AD%E5%9B%BD"
ret2 = unquote(url2, encoding='utf-8')
print(ret2)
# https://www.baidu.com/s?wd=中国
# By Ross
url3 = "http://52.6.7.6:9080/?json=%7B%22Action%22%3A%22GetAgentPing%22%2C%22ActionID%22%3A%22GetAgentPing0.2878004529042738%22%2C%22Command%22%3A%22Action%22%2C%22PBX%22%3A%221.102.4.106%22%2C%22Exten%22%3A%2225328661%22%7D×tamp=GetState1636429725795"
ret3 = unquote(url3, encoding='utf-8')
print(ret3)
# 结果:http://52.6.7.6:9080/?json={"Action":"GetAgentPing","ActionID":"GetAgentPing0.2878004529042738","Command":"Action","PBX":"1.102.4.106","Exten":"25328661"}×tamp=GetState1636429725795