最近開(kāi)始學(xué)習(xí)Python,也漸漸接觸Web開(kāi)發(fā)~

做了一個(gè)類似留言板的東西來(lái)練手——Http框架用的是web.py;html模板直接用Mako庫(kù),沒(méi)用web.py自帶的;后臺(tái)用MySQL,并且用sqlalchemy作ORM。雖然比較“簡(jiǎn)陋”,但也算是把Web開(kāi)發(fā)的不少東西聯(lián)系起來(lái)了。

一般的開(kāi)發(fā)還算比較順手,多看文檔還是可以完成的,直到我在測(cè)試的時(shí)候輸入中文字才發(fā)現(xiàn)出了大問(wèn)題。

首先掛的是web.input,原因是編碼錯(cuò)誤,它會(huì)將輸入的東東轉(zhuǎn)換成unicode編碼,由于默認(rèn)編碼為utf-8,把這些非utf-8編碼的東西當(dāng)作utf-8編碼然后強(qiáng)轉(zhuǎn)成unicode,顯然是有問(wèn)題的。問(wèn)了一個(gè)做web的學(xué)姐,發(fā)現(xiàn)是html文件沒(méi)有統(tǒng)一編碼。之后我將Vim的編碼設(shè)置重新配了一下,將代碼及html模板統(tǒng)一用utf-8保存,如此這般把這個(gè)問(wèn)題搞定了,但新的問(wèn)題又來(lái)了。

MySQL在存儲(chǔ)獲得的輸入數(shù)據(jù)時(shí),發(fā)現(xiàn)編碼有問(wèn)題,因?yàn)樵谏弦徊綄?shù)據(jù)都轉(zhuǎn)換成unicode,但是MySQL卻是latin-1的編碼(第一次安裝,沒(méi)配置也沒(méi)注意-_-|||),這樣又成一個(gè)編碼問(wèn)題。安全起見(jiàn),先將數(shù)據(jù)庫(kù)改成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í)在太不給力了,后來(lái)還是Google出方法來(lái),web.input可以帶一個(gè)_unicode的參數(shù),將其設(shè)成False就不會(huì)自動(dòng)轉(zhuǎn)成unicode了,形如_unicode=False。

這樣,中文數(shù)據(jù)從POST到存入數(shù)據(jù)庫(kù)也是木有問(wèn)題的,接下來(lái)出問(wèn)題的是GET的部分。Mako在渲染模板的時(shí)候出現(xiàn)編碼錯(cuò)誤,提示ascii的轉(zhuǎn)碼錯(cuò)誤,但理論上我的整套東西跟ascii無(wú)關(guān)的,應(yīng)該是模板配置的問(wèn)題。Google出limodou的文章,點(diǎn)
好吧,基本功能也就完成了,現(xiàn)在寫(xiě)得很丑陋,晚點(diǎn)再把源代碼發(fā)出來(lái)。

感覺(jué)中文編碼的問(wèn)題一直都很煩人~之前的Linux平臺(tái)下的C++項(xiàng)目,由于環(huán)境Locale設(shè)置得與程序里面默認(rèn)的不一致,直接導(dǎo)致程序里打不開(kāi)文件,還拋出異常來(lái)。