2010年9月14日 星期二

[aspx]utf8完全征服

我們知道現實,utf8現在是網頁上處理多國語言及與 ajax 互動的文字編碼。我們非得處理它不可。

當你在 aspx 上面寫好 charset=”UTF-8”,並不代表你把工作都做完了。還有一些工作要做。

(1) 在 head 裡加上 <meta http-equiv='Content-type' content='text/html; charset=UTF-8' />
這只是告訴 browser 會是UTF-8。但是不代表我們傳送出去的真的是UTF-8,得要另外想辦法。特別是 ashx,也沒地方加這個東西。

(2) 如果使用 Response.Write 方式輸出,就要改變 Response 的編碼。
Response.ContentEncoding = System.Text.Encoding.UTF8;
Response.Write(something);
something 是 .Net 的字串(string)。因此,你得確定 something 是 unicode 編碼而不是UTF-8或其他系統編碼。如此 Response.Write 輸出才會是對的 UTF-8。

(3) 在網頁中的連結或 Query String,例如 <a href=”http://localhost.com/中文連結”>你的連結</a>。
這種你可以賭,browser不會幫你做urlencode,且原來編碼跟你伺服器預設編碼一樣。但是請不要這樣做。直接在位置列打的連結會被urlencode,而在頁面上的則視不同瀏覽器有不一樣的結果,再加上每個使用者的預設編碼不一樣,你會被搞死。因此,幫自己一個忙,在連結上的中文字串,記得用 System.Web.HttpUtility.UrlEncode(dotnetstring, System.Text.Encoding.UTF8) 做編碼的動作。如此的連結所產生的 Request,IIS會正確地翻譯回正確的 .Net string。Query String 也是一樣的道理,產生正確的 urlencode 給瀏覽器,當 Request 送回來的時候,直接取用 Request.QueryString 就會是正確的值了。

(4) 如果你有需要從別的網頁拿資料回來,而使用 WebClient 要求資料。如果確定對方回來的字串是UTF-8,直接使用
WebClient wc = new WebClient();
string response = wc.DownloadString(theURL);
response裡面會出現亂碼。要改成
string response = System.Text.Encoding.UTF8.GetString( wc.DownloadData(theURL));

你以為已經轉好UTF-8了,要怎麼測試呢?有一個字「菓」不在big5編碼裡,可以拿這個字來測試你的系統。

沒有留言:

張貼留言