Python论坛  - 讨论区

标题:[python-chinese] 回复: Re: django的models.py必须是UTF8编码的吗?

2007年12月02日 星期日 02:13

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/

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年12月02日 星期日 09:16

1234 mydjango在gmail.com
星期日 十二月 2 09:16:53 HKT 2007

±àÂëÎÊÌâÊDZȽÏÍ·ÌÛ£¬µ«Èç¹û¶¼ÊÇutf-8 ÎÊÌâµ¹²»ÊǺܶࡣ

ÔÚ07-12-2£¬qinming zheng <zqm_zqm在yahoo.com.cn> дµÀ£º
>
>
> ÓÃUTF-8±àÂëÀ´Í³Ò»*.py´úÂë¡¢Êý¾Ý¿âºÍÍøÒ³Êä³öÒ²ÐíÊDZȽϷ½±ã£¬µ«ÊÇʹÓÃgb2312»òÕßgbkÀ´Í³Ò»£¬È´ÓÐÒÔϺô¦£º
>
> 1¡¢ÒÔǰµÄÊý¾Ý¿âÖеÄÊý¾Ý²»ÐèÒª×ö´úÂëת»»£¬¾ÍÄÜÖ±½ÓʹÓã»
>
> 2¡¢ÔÚwindowsÃüÁî´°¿Ú²»ÐèÒªÇл»´úÂëÒ³¾ÍÄÜÖ±½Ó²é¿´ºÍ±à¼­Êý¾Ý¿âÄÚÈÝ£»
>
> 3¡¢²»»á³öÏÖ±àÂë½Ø¶Ï´íÎó£»
>
> 4¡¢ËùÓеÄ*.py´úÂë¶¼²»Óñ£´æÎªutf-8¸ñʽ£¬ÕâÑùÓò»Ö§³Ö±àÂëת»»µÄ±à¼­Æ÷Ò²Äܹ»±à¼­£»
>
> 5¡¢Ïû³ýDZÔڵĴíÎó¡£
>
>
>
> Ŀǰ³öÏÖµÄ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
> 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
-------------- 下一部分 --------------
Ò»¸öHTML¸½¼þ±»ÒƳý...
URL: http://python.cn/pipermail/python-chinese/attachments/20071202/009b3c3b/attachment.html 

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

如下红色区域有误,请重新填写。

    你的回复:

    请 登录 后回复。还没有在Zeuux哲思注册吗?现在 注册 !

    Zeuux © 2025

    京ICP备05028076号