Django教程:[40]URL GET中文参数编码问题
今天在做一个网站登陆功能的时候发现一个问题,当访问我的网站的get请求带有中文参数的时候,总是会报错: 'ascii' codec can't decode byte 0xe7 。经过半天努力终于搞清楚是什么问题了。在python源码中我们经常用的是utf-编码,为了保持平台兼容性,我们也会让数据都是用utf-8编码。但是url中的参数如果有中文,通常用的是GB2312编码格式,这就导致了我们如果直接从URL中读取参数,会得到乱码,需要进行转换才可以,下面看看具体的代码。
先来看看python中的字符串编码问题,如果我们不声明字符串的编码格式,他们都是asci格式存储的,你看一下这种格式:
![Django教程:[40]URL GET中文参数编码问题](https://exp-picture.cdn.bcebos.com/979906196120a7cdefbfae4189b375d7987bdc64.jpg)
我们可以使用decode对其进行编码,这样实际转换成了unicode字符串
![Django教程:[40]URL GET中文参数编码问题](https://exp-picture.cdn.bcebos.com/50a010f85856d53d5df58d5a47d2bb665059ca64.jpg)
明白这个道理以后,我们还要知道:由于Django默认将内部的ansi字符串通过utf-8格式转化成unicode。所以如果是处理自己网站产生的URL中文参数是没有问题的(因为自己的response是utf-8的),但是如果是用户输入的或者其他网站的请求,浏览器会使用gb2312编码中文,然后你的django会使用utf-8进行解码,当然会发生错误:urldecode 'ascii' codec can't decode byte
![Django教程:[40]URL GET中文参数编码问题](https://exp-picture.cdn.bcebos.com/35fa07efa25f0c14c5a987310d89a146b6b13865.jpg)
所以,我们对进来的中文进行恰当的编码就可以了。我们首先可以对request进行gb2312编码,这样就与字符串本身的编码方式相同,得到unicode字符串
![Django教程:[40]URL GET中文参数编码问题](https://exp-picture.cdn.bcebos.com/efb861bd4c7c34b32c9366095841037de0373165.jpg)
之后,我们再使用utf-8进行编码就可以得到正确的字符串了。
![Django教程:[40]URL GET中文参数编码问题](https://exp-picture.cdn.bcebos.com/23fd63c5cf672b5fcf9450253314f4d0b4032765.jpg)
我也是python django新手,如果有什么问题,欢迎赐教,以下是我今天用到的一些代码:
def user_login(request):
request.encoding='gb2312'
api_info='登陆接口URL'
try:
callback=request.GET.get('callback')
callback=callback.encode('utf-8')
except Exception as e:
callback='fuck!!!'
f=open('d:/log.txt','a')
f.write('api:%s,islogin:%s.
' % (api_info,callback))
f.close()