最近开始学习Python,也渐渐接触Web开发~

做了一个类似留言板的东西来练手——Http框架用的是web.py;html模板直接用Mako库,没用web.py自带的;后台用MySQL,并且用sqlalchemy作ORM。虽然比较“简陋”,但也算是把Web开发的不少东西联系起来了。

一般的开发还算比较顺手,多看文档还是可以完成的,直到我在测试的时候输入中文字才发现出了大问题。

首先挂的是web.input,原因是编码错误,它会将输入的东东转换成unicode编码,由于默认编码为utf-8,把这些非utf-8编码的东西当作utf-8编码然后强转成unicode,显然是有问题的。问了一个做web的学姐,发现是html文件没有统一编码。之后我将Vim的编码设置重新配了一下,将代码及html模板统一用utf-8保存,如此这般把这个问题搞定了,但新的问题又来了。

MySQL在存储获得的输入数据时,发现编码有问题,因为在上一步将数据都转换成unicode,但是MySQL却是latin-1的编码(第一次安装,没配置也没注意-_-|||),这样又成一个编码问题。安全起见,先将数据库改成utf-8编码,之后要做的就是将要保存的数据确保是utf-8编码就行。当然,对于那些已转成unicode的数据再转回utf-8肯定是可以的,但这绝对不是一个Geeker应该做的。在IDLE里面help了一下web.input的文档,实在太不给力了,后来还是Google出方法来,web.input可以带一个_unicode的参数,将其设成False就不会自动转成unicode了,形如_unicode=False。

这样,中文数据从POST到存入数据库也是木有问题的,接下来出问题的是GET的部分。Mako在渲染模板的时候出现编码错误,提示ascii的转码错误,但理论上我的整套东西跟ascii无关的,应该是模板配置的问题。Google出limodou的文章,点这里。文中提到,Mako在渲染中文时需要先传入经过unicode()转码,否则其内部会默认当作ascii进行转换,也就得出了上面的错误,果然又是中文编码的问题。在模板渲染器Render创建时加入output_encoding='utf-8'的参数,这样就能将中文显示出来了。对于传入渲染的参数为非utf-8的情况,还可以使用Mako的default_filters,详细的可以看看文档吧!

好吧,基本功能也就完成了,现在写得很丑陋,晚点再把源代码发出来。

感觉中文编码的问题一直都很烦人~之前的Linux平台下的C++项目,由于环境Locale设置得与程序里面默认的不一致,直接导致程序里打不开文件,还抛出异常来。