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

2012-05-18 22:22:08 +08:00
 iiduce
好几个小时都没弄好,抓狂了,发出来请大家帮忙看看:

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'编码。

可是还不行,大家帮忙看看哪里出了问题?
7246 次点击
所在节点    Django
15 条回复
bhuztez
2012-05-18 22:31:39 +08:00
tags = [u'电视机', u'冰箱', u'洗衣机']

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

http://yibin.us/archives/6817
ninjai
2012-05-18 23:55:35 +08:00
不要在代码里直接使用 Unicode 字符
Yan_6
2012-08-24 16:49:44 +08:00
#coding=utf-8
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
2012-08-25 11:04:44 +08:00
话说上次用Flask遇到过编码问题,我把所有的str用unicode替代之后就OK了,现在我也在用Django,平台是Linux + Python2.7 + Django1.4,目前尚未出现编码问题
YUCOAT
2012-08-25 11:07:25 +08:00
有时候可以这样:
t = u'电视机'
传值的时候可以这样:
t.decode('UTF-8')

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

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

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

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

© 2021 V2EX