Django 中文编码又出错,出错信息:'latin-1' codec can't encode characters...

Django 中文编码又出错,出错信息:'latin-1' codec can't encode characters...

我以为我理解了, 实际上还是不明白 .. :em11:

django+ mysql   提交汉字到mysql 出错 ..

mysql 为utf-8

网页保存也是utf-8
<META http-equiv=Content-Type content="text/html; charset=utf-8">

程序头也用了
#!/usr/bin/python
#coding=utf-8

import sys
reload(sys)
sys.setdefaultencoding('utf8')

连接数据库的时候也用了
cursor.execute('set names utf8')

还是出错..  NND

[Copy to clipboard] [ - ]
CODE:
UnicodeEncodeError at /
'latin-1' codec can't encode characters in position 31-32: ordinal not in range(256)

41. cursor.execute(sql) ...
/usr/lib/python2.4/site-packages/MySQLdb/cursors.py in execute
146. query = query.encode(charset)

不能更改cursors.py里面的execute
      def execute(self, query, char="utf-8", args=None):

改了之后 中文问题是能解决, 但是我要用session ,  

更改了cursosr.py 之后
运行命令 manage.py syncdb  报错




我还能怎么做, 救命阿 ..  

建数据库用utf8格式,py文件也保持为utf8格式。


QUOTE:
原帖由 guotie 于 2008-11-24 10:03 发表
建数据库用utf8格式,py文件也保持为utf8格式。

我帖子上已经说明了. , 我已经是这样做的了
哈哈, 开心阿, 问题自己解决了;
做个记录备忘  .. ^-^  以后不记得的时候回来看看 ..

用python + django +mod_python +mysql 来写程序 , 曾经我被中文编码也搞昏狠了, 看了不下N天的资料文档,google被我翻烂了,不管是中文的还是英文的 ;

后来决定统一编码:

1:python 写的程序, 统一用 utf-8 ,以及重新载入utf-8

#!/usr/bin/python
#coding=utf-8

import sys,os
reload(sys)
sys.setdefaultencoding('utf8')


2: django 的模板, 也就是html程序
  统一保存格式为utf-8 , 并且html 申明 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  
3:Mysql 建立数据库,数据库使用UTF-8

自此问题应该能全部解决 , 如还出现编码错误,
修改/usr/lib/python2.4/site-packages/MySQLdb/cursors.py
原来是:
charset = db.character_set_name()
query = query.encode(charset)
修改为:
query = query.encode('utf-8')
去掉charset那行  !

//==================================================================================================
总结下我提的那问题:
我前面也是按照1-3那样来做的,  但是再提交中文表单的时候还是出现了错误,
UnicodeEncodeError at /
'latin-1' codec can't encode characters ...

然后在网上搜索了很多资料,他们说的基本就是. (搜索的资料再多,但都是同一个人写的, 到处转载来转载去的. 呵呵)

网上说的都是修改cursors.py 127行 , 加上 char="utf-8" ,然后再146行前面再加上charset = char ,修改后的片断为:
def execute(self, query, char="utf-8", args=None):    //127行
     .....
           charset = char
           query = query.encode(charset)

这样改动是能解决中文问题,

但我在实际中, 因为我在后面要用到session , 执行了manage.py syncdb 生成Session要用的数据库, ..   然后写数据库的时候又开始报错,
encode() argument 1 must be string, not list
Request Method:         GET
Exception Type:         TypeError
Exception Value:        encode() argument 1 must be string, not list
Exception Location:     /usr/lib/python2.4/site-packages/MySQLdb/
cursors.py in execute, line 146

没人帮我解决问题, 自己解决了..  没有用网上说的,
我直接修改默认的cursors.py 里面的 query = query.encode('utf-8')
问题解决
中文编码的问题的确很烦。

我现在也是处处小心。