2013年9月25日 星期三

ASP UTF-8 編碼發生錯誤後,網站變亂碼

當在 IIS 站台中建立以 UTF-8 編碼的網頁後,發生 500 錯誤時,IIS 預設的訊息是以作業系統為準,所以我的 IIS 就會以 BIG5 編碼回傳錯誤訊息。
這時,你看到的全部都是亂碼,好,Google 一下,你會發現大家都告訴你要自訂錯誤,把 C:\WINDOWS\Help\iisHelp\common 目錄下的 500-100.asp 複製到你的網站,例如根目錄下,再去 IIS 中把自訂訊息中的 500 改成以 URL 指到 /500-100.asp。同時,這個 500-100.asp 的檔案,不要忘了存成 UTF-8 格式。
當一切都準備好了,也的確看到了正確顯示的訊息,不過‧‧‧噩夢才剛開始!
當再度發生 500 錯誤,雖然這時你可以很清楚得知是那一行程式碼有問題,不過接下來,整個網站全部變成亂碼!解決方法有兩種:一個、重啟 IIS 或把 global.asa 改一下,第二個、關閉瀏覽器(要全部關喔)重開。
真他媽的王八蛋,這是什麼玩意兒!
聽我講完噩夢以及罵人後,就要講解決方法了:
首先,改變 500-100.asp 這個動作是沒有問題的,也的確要這麼作,這裡有個測試頁,指令打錯字,產生的錯誤,是不是沒有亂碼了?(這份500-100.asp 是我自己改的,原作可沒有這麼可愛咧)。
其次,整個網站變亂碼的問題,一樣出在 500-100.asp 這個檔案中,找到 Session.Codepage 這裡,你會發現 M$ 的大哥把編碼指定為 1252,非常怪,如果是 BIG5,也該指定成 950 啊!1252 是 window-1252 的編碼,而且這個指令是 Session 喔!難怪一發生錯誤,呼叫了 500-100.asp 後,你所有頁面會變亂碼!
自己改,建議你這麼改:
  1. 找到 Session.Codepage=1252,改成 Session.Codepage=65001。這行之上,有一行 bakCodepage = Session.Codepage ,用意是把原編碼保存,不過,通常如果沒有指定這個編碼時,預設就是作業系統語言。所以才要進行下一項修正。
  2. 在檔案一開始 Option Explicit 後插入兩行:
    Response.Charset="utf-8"
    Session.Codepage=65001
    其實,Session.Codeopage 的設定,你也可以加在 global.asa 的 Session_OnStart 裡。
  3. 第一行 <%@ language="VBScript" %> 刪不刪,看你的心情了!