最近開始學習Python,也漸漸接觸Web開發(fā)~
做了一個類似留言板的東西來練手——Http框架用的是web.py;html模板直接用Mako庫,沒用web.py自帶的;后臺用MySQL,并且用sqlalchemy作ORM。雖然比較“簡陋”,但也算是把Web開發(fā)的不少東西聯(lián)系起來了。
一般的開發(fā)還算比較順手,多看文檔還是可以完成的,直到我在測試的時候輸入中文字才發(fā)現(xiàn)出了大問題。
首先掛的是web.input,原因是編碼錯誤,它會將輸入的東東轉(zhuǎn)換成unicode編碼,由于默認編碼為utf-8,把這些非utf-8編碼的東西當作utf-8編碼然后強轉(zhuǎn)成unicode,顯然是有問題的。問了一個做web的學姐,發(fā)現(xiàn)是html文件沒有統(tǒng)一編碼。之后我將Vim的編碼設(shè)置重新配了一下,將代碼及html模板統(tǒng)一用utf-8保存,如此這般把這個問題搞定了,但新的問題又來了。
MySQL在存儲獲得的輸入數(shù)據(jù)時,發(fā)現(xiàn)編碼有問題,因為在上一步將數(shù)據(jù)都轉(zhuǎn)換成unicode,但是MySQL卻是latin-1的編碼(第一次安裝,沒配置也沒注意-_-|||),這樣又成一個編碼問題。安全起見,先將數(shù)據(jù)庫改成utf-8編碼,之后要做的就是將要保存的數(shù)據(jù)確保是utf-8編碼就行。當然,對于那些已轉(zhuǎn)成unicode的數(shù)據(jù)再轉(zhuǎn)回utf-8肯定是可以的,但這絕對不是一個Geeker應(yīng)該做的。在IDLE里面help了一下web.input的文檔,實在太不給力了,后來還是Google出方法來,web.input可以帶一個_unicode的參數(shù),將其設(shè)成False就不會自動轉(zhuǎn)成unicode了,形如_unicode=False。
這樣,中文數(shù)據(jù)從POST到存入數(shù)據(jù)庫也是木有問題的,接下來出問題的是GET的部分。Mako在渲染模板的時候出現(xiàn)編碼錯誤,提示ascii的轉(zhuǎn)碼錯誤,但理論上我的整套東西跟ascii無關(guān)的,應(yīng)該是模板配置的問題。Google出
limodou的文章,點
好吧,基本功能也就完成了,現(xiàn)在寫得很丑陋,晚點再把源代碼發(fā)出來。
感覺中文編碼的問題一直都很煩人~之前的Linux平臺下的C++項目,由于環(huán)境Locale設(shè)置得與程序里面默認的不一致,直接導致程序里打不開文件,還拋出異常來。