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