星期三, 4月 02, 2008

[.Net]亂碼 1/2

此亂碼非彼亂馬啊~
家裏 Server 的 Mono 升級到 1.9 以後,ASP.Net 網頁裡的中文突然都變成了亂碼,可是我什麼都沒改啊~
由於個人因素 (就是懶啦),一直都沒去管,今天看開了,決定找出真兇...

首先試著直接跑 xsp2 之後,用 Browser 去看結果,正常,沒有亂碼。很好,那麼應該是 mod_mono 跟 Apache 的問題囉~
再看看有亂碼的網頁,看看送出來的網頁與 Response header 是否正確,送出來網頁的中文都變成了 ?,可是從資料庫撈出來的字卻又都沒問題,可以正常顯示,網頁的 Response header 也沒問題。很好,那真的是 mod_mono 與 Apache 的問題了。

仔細看了 mod_mono 的設定,唯一我覺得有問題的,就是 MonoSetEnv,可是我確實地已經設定了 MonoSetEnv "LANG=en_US.UTF-8",應該不會有問題才對。
好,那麼就寫個簡單的網頁把所有環境變數列出來看看,果不其然,LANG = C,這表示LANG並沒有被設定,那麼會出現亂碼也是很正常的了。LANG 對 Linux 來說,是很重要的環境變數,沒有這個,很多應用程式將無法判斷目前所在的語系與編碼。
那麼是 mod_mono 問題囉?可是看過 source code 之後,發現沒有特別針對 MonoSetEnv 做什麼修正,再回頭看看列出來的環境變數,我發現我在設定檔裡面設定的 TEMP 環境變數有生效,那麼?!

再仔細看一次 mod_mono 的說明,原來如果你要設定多個環境變數時,要加上 ';',所以在我改寫為 MonoSetEnv "LANG=en_US.UTF-8;TEMP=/var/tmp",重新啟動之後,問題就解決了。

p.s. 那...為啥以前沒錯?! 我想可能是 Apache 的 apr 行為有改變吧~

沒有留言: