[python-chinese] 回复: Re: django的models.py必须是UTF8编码的吗?
qinming zheng
zqm_zqm在yahoo.com.cn
星期日 十二月 2 02:13:22 HKT 2007
用UTF-8编码来统一*.py代码、数据库和网页输出也许是比较方便,但是使用gb2312或者gbk来统一,却有以下好处:
1、以前的数据库中的数据不需要做代码转换,就能直接使用;
2、在windows命令窗口不需要切换代码页就能直接查看和编辑数据库内容;
3、不会出现编码截断错误;
4、所有的*.py代码都不用保存为utf-8格式,这样用不支持编码转换的编辑器也能够编辑;
5、消除潜在的错误。
目前出现的Django+Sqlite3教程中,大都建议统一成UTF-8,反而大家熟悉的gb2312和gbk很少被提到。也许是因为django和sqlite3默认对utf-8的支持太有力掩盖了它们对其他编码方式的支持?
Sqlite3对gbk编码的支持几乎是自然而然的,用命令行sqlite3
test.db打开一个数据库,随便创建一个表,然后插入gbk中文,再查看,结果显示的就是gbk中文;存入utf-8中文,select出来就是utf-8中文。你存进去的是什么编码,select出来的就还是什么编码。所以Sqlite3支持gbk是没有任何问题的。
而Django呢,虽然它建议初学者使用utf-8,但它仍然保留了修改编码方式的接口,只不过这个接口有点不彻底。在global_settings.py文件中,有一行:
DEFAULT_CHARSET = 'utf-8'
说明django中默认的编码方式是utf-8,如果要使用gbk,很简单,在自己的Project目录下的settings.py中加入:
DEFAULT_CHARSET = 'gbk'
就行,因为settings.py中的设置会覆盖global_settings.py中的。
可是,单单改这一个地方还不够,还有一个地方必须改,否则会出现OperationalError:
Could not decode to UTF-8 column
...错误。这是因为django默认为从sqlite3返回的一定是utf-8编码的内容,如果返回的是gbk,就会报错。要纠正这一误会也很简单,需要在djanggo\db\backends\sqlite3\base.py中在59行前插入:
self.connection.text_factory = str
同时将64行注释掉:
#cursor.row_factory = utf8rowFactory
至于text_factory和row_factory是什么含义,在Python的Documents中有,请自查。
完成这两个步骤以后,恭喜你,现在的Django+Sqlite3已经可以支持gbk了,不知你感觉怎么样?
反正我是觉得很爽。
--- Ben Luo <benluo在gmail.com>写道:
> On Nov 25, 2007 9:15 PM, Shao Feng
> <sevenever在gmail.com> wrote:
>
> >
> >
> > On Nov 25, 2007 10:18 AM, limodou
> <limodou在gmail.com> wrote:
> >
> > > On Nov 25, 2007 12:23 AM, Shao Feng
> <sevenever在gmail.com> wrote:
> > > > -----BEGIN PGP SIGNED MESSAGE-----
> > > > Hash: SHA1
> > > >
> > > > 大家好:
> > > > 我初学django,跟着limodou的Django step by
> step学。
> > > > 我在一个文件开头声明了 -*- coding:gbk
> -*-,
> 然后保存为gbk编码,但是在浏览的页面里出现了乱码。
> > > > 如果把浏览器 查看-->字符编码 选择
> 中文gbk,就能正常显示了。
> > > >
> > > 当然不一定,但是要统一。
> > >
> >
>
limodou前辈说的统一是哪些东西要统一啊?是说文件开头声明的编码和实际文件编码要统一吗?还是所有的py文件都要统一编码?
> >
> > >
>
Django最终是显示为html页面。你只要保证最终显示的页面格式是统一的应该就可以了吧。不过为了让事情简单,你可以所有的都按utf-8来编码。
> > _______________________________________________
> python-chinese
> Post: send python-chinese在lists.python.cn
> Subscribe: send subscribe to
> python-chinese-request在lists.python.cn
> Unsubscribe: send unsubscribe to
> python-chinese-request在lists.python.cn
> Detail Info:
http://python.cn/mailman/listinfo/python-chinese
___________________________________________________________
进入雅虎游戏嘉年华,赢取液晶显示器!
http://cn.mail.yahoo.com/promo/carnival07/
关于邮件列表 python-chinese 的更多信息