2008年8月8日 星期五

Python的URL encode 處理utf8的方法(用在google chart)

google的chart api, 是採用get的方式把資料傳入api中, 例如輸出這樣的URL:

http://chart.apis.google.com/chart?cht=p3&chd=t:60,40&chs=250x100&chl=Hello|World


就可以得到這樣的圓餅圖:

Yellow pie chart

只是輸入的資料都只能用get的方式丟給chart api, google另外提供了資料encode的方式, 以及提供javascript 的範例將資料送入google api, 將chart畫出。但後來發現我把unicode的中文直接丟入get的參數值裡, 都會變成亂碼, 所以必須先將 unicode的字串先做quote()處理:

urls=urls.encode('utf8')
urls=urllib.quote(urls,'&=')

我有把'&'及'='排除, 是因為我已經先把URL的各個參數及值都組合好了, 若沒有排除'&'及'=', 瀏覽器會無法解析成我們要的URL, 經過這樣的處理, 就會變成:

http://chart.apis.google.com/chart?chd=t%3A41.3%2C33.02%2C11.74%2C10.01%2C2.6%2C1.33&chl=%E7%9C%BC%E7%9D%9B%E5%A4%A7%2841.3%25%29%7C%E8%84%B8%E5%A4%A7%2833.02%25%29%7C%E5%B1%81%E8%82%A1%E5%A4%A7%2811.74%25%29%7C%E6%9D%8E%E5%AE%87%E6%98%A5%2810.01%25%29%7C%E7%BE%8E%E8%8B%A5%E5%A4%A9%E4%BB%99%282.6%25%29%7C%E8%83%B8%E9%83%A8%E5%A4%A7%281.33%25%29&chs=600x200&cht=p3&chtt=%E4%BD%A0%E5%A5%B3%E6%9C%8B%E5%8F%8B%E6%BC%82%E4%BA%AE%E5%90%97%28%E6%9B%BE%E7%A7%8B%29&chco=3399cc&chts=333333%2C25

然後就得到我們要的樣子了:

2008年8月7日 星期四

Python的縮排方式, 空白和tab是有分的啦!!!


這個故事有點笨, 希望沒人跟我一樣....

話說前一陣子申請了google的app engine, 當然是要花時間好好玩一下, 但python其實有點冷門, 用的人很少, 但google用它應該是有道理的, 就試看看吧。花了點時門看了入門說明, 想要測一下程式, 結果一開始就遇到了一些問題, 程式碼一直在某些行出現錯誤(unexpected indent), 怎麼改都一直出錯, 搞了幾個小時還沒搞定, 但直接複製sample code就OK, 被我改過就掛掉, 最後實在氣到把電腦給關了。

過了幾天才有空再開來玩, 因為我是用notepad++來編輯, 它有支援python的keyword都能自動顯示粗體or顏色, 用起來還OK, 但我突然注意到, 每個行首他都會有程式區塊的mark符號, 讓你可以簡單地分辨各個區塊(像是loop or if else等等), 但python並不用C or basic or delphi常用的 {...} or do...loop or begin...end, 而是用最原始的"縮排"來判斷, 並且縮排可用空白or Tab來做, 並不強制。

而我直接copy google的sample code來測試, sample慣用的縮排是2個空白字元, 而我改了幾個地方常常連2個縮排就用1個Tab來做(我把notepad++的Tab設成4個字元), 結果python因為它用縮排來判斷程式區塊, 以至於我有些區塊都被compiler誤判了, 當然就錯誤連連....

結論是, 如果習慣用空白來做縮排, 就請同一個檔案裡都用空白來縮排, 這樣就不會有錯, 若用Tab就全用Tab來做, 後來我是把code全改用Tab來做縮排, 終於所有的錯誤都不見啦!!!

PS: 其實第1天的錯誤訊息就講的很明白(unexpected indent), 但我明明知道它說indent, 但在notepad++裡空白和tab看起來就都完全一個樣呀!!! 除非你把文字游標走過去才能發現.....