V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
feihu
V2EX  ›  Python

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

  •  
  •   feihu · 2013-04-01 23:03:02 +08:00 · 7761 次点击
    这是一个创建于 4257 天前的主题,其中的信息可能已经有所发展或是发生改变。
    使用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的问题
    第 1 条附言  ·  2013-04-02 00:34:05 +08:00
    脚本使用file命令看的话,输出为 UTF-8 Unicode Java program text,运行在gunicorn上面,直接访问gunicorn。 request.POST.get('title') 得到的类型为unicode。但是执行
    title.decode('gbk')
    title.encode('gbk')
    title.decode('utf-8')
    都会报异常
    执行title.encode('utf-8')不会报异常,但是显示乱码
    11 条回复    1970-01-01 08:00:00 +08:00
    notedit
        1
    notedit  
       2013-04-01 23:46:17 +08:00   ❤️ 1
    不用转gbk request.POST.get('title') 得到的是unicode 直接encode('utf-8')
    feihu
        2
    feihu  
    OP
       2013-04-02 00:17:47 +08:00
    @notedit 直接encode('utf-8') 还是乱码,django是运行在gunicorn上面的,直接请求的是gunicorn,跟这个有关系吗?
    notedit
        3
    notedit  
       2013-04-02 00:24:28 +08:00   ❤️ 1
    @feihu 你在哪里看是乱码?
    feihu
        4
    feihu  
    OP
       2013-04-02 00:29:46 +08:00
    @notedit 我打印日志了,在终端中看到是乱码,网页显示也是乱码,如果是改成request.setencoding的话,终端与网页都显示正常
    notedit
        5
    notedit  
       2013-04-02 00:36:02 +08:00   ❤️ 1
    @feihu 检查你的DEFAULT_CHARSET设置
    feihu
        6
    feihu  
    OP
       2013-04-02 00:50:20 +08:00
    @notedit DEFAULT_CHARSET 指的的是django.config.settings里面的DEFAULT_CHARSET 吗?那个是UTF8
    notedit
        7
    notedit  
       2013-04-02 03:44:09 +08:00
    @feihu 那这样应该没有问题啊 你什么系统呢 另外检查一下你所有的python文件的编码是不是#encoding:utf-8
    feihu
        8
    feihu  
    OP
       2013-04-02 20:11:24 +08:00
    @notedit mac,我全部都加了encoding:utf-8,文件都保存为utf-8了。但是还是不成,
    nkliwenjian
        9
    nkliwenjian  
       2013-04-02 23:08:09 +08:00   ❤️ 1
    有没有在sitecustomize.py文件里面写上
    import sys
    sys.setdefaultencoding('utf-8')
    feihu
        10
    feihu  
    OP
       2013-04-03 12:50:30 +08:00
    @nkliwenjian 不可以,我现在的情况是这样的,如果提交的数据是utf8编码的,能正常显示,但是如果提交的是gkb的话,就无法正常显示了,调用 encode解码会报错, 如果在request.POST.get之前指定编码方式为gbk,那么就能正确显示了。但是我觉得在get之前先指定编码方式有一些反人类。所以想找一个方法能在get之后能对字符串进行编码转换。
    nkliwenjian
        11
    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'),这样应该就对了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1061 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 22:10 · PVG 06:10 · LAX 14:10 · JFK 17:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.