django如何正确的把gbk 转码为utf8

2013-04-01 23:03:02 +08:00
 feihu
使用django编写了一个小程序,从客户端得到title,python文件已经保存为utf8.

代码如下

#encoding:utf-8

def addTitle(request):
title = request.POST.get('title')
title = title.decode('gbk')
title = title.encode('utf-8')

如果是title为gbk的话,会在title = title.decode('gbk') 报 UnicodeEncodeError 异常

请问应该要如何写才能转换为utf-8

看到一种处理方式是先设置request的解码方式,然后在从POST取,这样取出来的值就正确了。代码如下:
request.encoding('gbk')
title = request.POST.get('title')

但是感觉这样写感觉有一些奇怪,能否有更好的方式来处理gbk转utf8的问题
7604 次点击
所在节点    Python
11 条回复
notedit
2013-04-01 23:46:17 +08:00
不用转gbk request.POST.get('title') 得到的是unicode 直接encode('utf-8')
feihu
2013-04-02 00:17:47 +08:00
@notedit 直接encode('utf-8') 还是乱码,django是运行在gunicorn上面的,直接请求的是gunicorn,跟这个有关系吗?
notedit
2013-04-02 00:24:28 +08:00
@feihu 你在哪里看是乱码?
feihu
2013-04-02 00:29:46 +08:00
@notedit 我打印日志了,在终端中看到是乱码,网页显示也是乱码,如果是改成request.setencoding的话,终端与网页都显示正常
notedit
2013-04-02 00:36:02 +08:00
@feihu 检查你的DEFAULT_CHARSET设置
feihu
2013-04-02 00:50:20 +08:00
@notedit DEFAULT_CHARSET 指的的是django.config.settings里面的DEFAULT_CHARSET 吗?那个是UTF8
notedit
2013-04-02 03:44:09 +08:00
@feihu 那这样应该没有问题啊 你什么系统呢 另外检查一下你所有的python文件的编码是不是#encoding:utf-8
feihu
2013-04-02 20:11:24 +08:00
@notedit mac,我全部都加了encoding:utf-8,文件都保存为utf-8了。但是还是不成,
nkliwenjian
2013-04-02 23:08:09 +08:00
有没有在sitecustomize.py文件里面写上
import sys
sys.setdefaultencoding('utf-8')
feihu
2013-04-03 12:50:30 +08:00
@nkliwenjian 不可以,我现在的情况是这样的,如果提交的数据是utf8编码的,能正常显示,但是如果提交的是gkb的话,就无法正常显示了,调用 encode解码会报错, 如果在request.POST.get之前指定编码方式为gbk,那么就能正确显示了。但是我觉得在get之前先指定编码方式有一些反人类。所以想找一个方法能在get之后能对字符串进行编码转换。
nkliwenjian
2013-04-03 14:18:17 +08:00
没用过gunicorn这个东西,不过可以断定是这个东西引起的。我给你分析一下。正常的浏览器的一个post请求,无论是直接用表单提交的还是用ajax提交的,在网络上传输的时候使用的基本上都是utf-8编码,然后在django这端的话会先把他进行utf-8解码,这样开发人员直接用request.POST拿到的就是unicode的字符串。所以并不存在说“提交的是gbk”,这个压根就是做不到的。

你现在的gunicorn,提交的是gbk,但是在django这里,还是会先utf-8解码,这个解码就虽然不会有异常,但是整个码就错了,所以你后面再操作就错了。所以严格来说你就必须request.setencoding,目的是告诉django,传过来的请求不是utf-8编码的,别瞎解码。

想验证我的猜想是不是对的,很简单,得到request.POST之后,先encode('utf-8'),还原成原始的gbk编码,然后再decode('gbk'),这样应该就对了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/64690

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX