V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iiduce
V2EX  ›  Django

遇到django中头痛的中文编码问题,大家帮忙看看

  •  1
     
  •   iiduce · 2012-05-18 22:22:08 +08:00 · 7422 次点击
    这是一个创建于 4601 天前的主题,其中的信息可能已经有所发展或是发生改变。
    好几个小时都没弄好,抓狂了,发出来请大家帮忙看看:

    view文件中:

    tags = ['电视机', '冰箱', '洗衣机']

    输出到模板中显示该变量,浏览器报错:
    'ascii' codec can't decode byte 0xe7 in position 0: ordinal not in range(128)

    我通过调试,发现tags的值为 ['\xe7\x94\xb5\xe8\xa7\x86\xe6\x9c\xba', '\xe5\x86\xb0\xe7\xae\xb1', '\xe6\xb4\x97\xe8\xa1\xa3\xe6\x9c\xba']

    如果变量这样写 tags = [u'电视机', u'冰箱', u'洗衣机']
    浏览器中会直接显示unicode编码:[u'\u7535\u89c6\u673a', u'\u51b0\u7bb1', u'\u6d17\u8863\u673a']

    为了解决编码问题,我做了如下工作:
    1. 确保所有py文件编码均为utf-8,在所有py文件头部添加:#-*- coding: utf-8 -*-
    2. 确保所有模板html文件编码为utf-8,并在html头部声明<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    3. settings文件中声明LANGUAGE_CODE = 'zh-cn' DEFAULT_CHARSET = 'UTF-8'
    4. 数据库应该也没问题,使用的mongodb,默认使用的就是'utf-8'编码。

    可是还不行,大家帮忙看看哪里出了问题?
    15 条回复    1970-01-01 08:00:00 +08:00
    bhuztez
        1
    bhuztez  
       2012-05-18 22:31:39 +08:00   ❤️ 1
    tags = [u'电视机', u'冰箱', u'洗衣机']

    说不定就行了
    iiduce
        2
    iiduce  
    OP
       2012-05-18 22:35:24 +08:00
    @bhuztez
    我这样试过了,浏览器中会直接显示unicode编码:[u'\u7535\u89c6\u673a', u'\u51b0\u7bb1', u'\u6d17\u8863\u673a'],哎,以前两个django项目没有遇到这个问题啊~
    bhuztez
        3
    bhuztez  
       2012-05-18 22:36:39 +08:00
    @iiduce {% for tag in tags %}{{ tag }}{% endfor %}
    iiduce
        4
    iiduce  
    OP
       2012-05-18 22:38:34 +08:00
    @bhuztez
    我实际应用的时候是循环输出的(也不能显示中文)。为了方便说明问题,直接输出了列表。
    bhuztez
        5
    bhuztez  
       2012-05-18 22:39:36 +08:00   ❤️ 1
    @iiduce 直接输出列表当然是长这样了啊。循环输出 u'XXX' 了应该没问题的。
    iiduce
        6
    iiduce  
    OP
       2012-05-18 22:43:33 +08:00
    @bhuztez 现在循环输出真的可以了,感谢+1
    kojp
        7
    kojp  
       2012-05-18 22:45:51 +08:00
    哈哈,前一阵我也被折腾得够呛。
    参考此帖http://www.v2ex.com/t/35062
    希望对你有帮助!
    iiduce
        8
    iiduce  
    OP
       2012-05-18 22:58:34 +08:00
    @kojp 谢谢,我去看看。 现在还没有搞清楚的是, 在之前项目里 定义中文字符串前没有加u(unicode编码,类似u'冰箱')也是可以的,这回怎么就不行了呢~~
    kojp
        9
    kojp  
       2012-05-18 23:07:15 +08:00
    @iiduce 这个,你就别“执着”了。系统环境呀,软件版本呀,数据库环境呀。。各种都会有影响的。
    我上次折腾那么久,大概总结了三点(说好的详细总结其实也没写,下周末写吧,拖延症!!!桑不起)
    1,不管输入什么以什么输入,统一保存成UNICODE。不管什么环境,什么软件,统一成UTF8
    2,LIST和STRING的用法,以及本质了解。
    3,善于使用chardetect, codec,isinstanceof 这之类的内置方法
    ccdjh
        10
    ccdjh  
       2012-05-18 23:52:18 +08:00
    可以看一下这个:

    http://yibin.us/archives/6817
    ninjai
        11
    ninjai  
       2012-05-18 23:55:35 +08:00
    不要在代码里直接使用 Unicode 字符
    Yan_6
        12
    Yan_6  
       2012-08-24 16:49:44 +08:00
    #coding=utf-8
    CoX
        13
    CoX  
       2012-08-24 17:10:03 +08:00
    我也遇到个编码的问题,真的跟系统环境有很大关系。

    http://dl.pycox.com/view/2012/0822/
    这个应用是放在openshift上的,这里有一张中文名的图片,图片是存在dropbox上的。
    我是先取到(openshift)本地,但是在 f=open(filename,'wb') 的时候,因为filename含有中文,一直提示编码错误。

    但是同样的应用代码,在windows上调试一点问题都没有。搞了俩小时没搞定,暂时放弃了。
    YUCOAT
        14
    YUCOAT  
       2012-08-25 11:04:44 +08:00
    话说上次用Flask遇到过编码问题,我把所有的str用unicode替代之后就OK了,现在我也在用Django,平台是Linux + Python2.7 + Django1.4,目前尚未出现编码问题
    YUCOAT
        15
    YUCOAT  
       2012-08-25 11:07:25 +08:00
    有时候可以这样:
    t = u'电视机'
    传值的时候可以这样:
    t.decode('UTF-8')
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5489 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 07:02 · PVG 15:02 · LAX 23:02 · JFK 02:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.