直接用程式說明一下今天遇到的狀況,呼叫端是個純HTML網頁,用jQuery.get呼叫後端程式取得一段文字結果:

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <script src="../js/jquery-1.3.2.js" type="text/javascript"></script>
    <script type="text/javascript">
        $(function() {
            $.ajaxSetup({ cache: false });
            $.get("ServerSide.asp", {}, function(r) {
                alert(r);
            });
        });
    </script>
</head>
<body></body></html>

ServerSide.asp是古早時代寫的ASP網頁,為簡化起見,假設內容是<% Response.Write "Job Done!" %>,執行結果正常,前端會彈出Job Done!訊息。

使用者反應訊息是英文看嘸,所以想改成<% Response.Write "作業完成" %>。修改後alert有彈出來,但訊息部分空白一片,感覺上像ServerSide.asp傳回空字串一樣。

想了一下,應是Encoding問題,古代的ASP輸出結果用的是BIG5編碼;而HTML端的XmlHttpRequest預設會用UTF-8去解譯傳回的BIG5編碼文字,投捕默契不佳形成暴投。我用escape(r)偷看了一下解譯結果,
%uFFFF @ %uFFFF%7E%uFFFF%uFFFF%uFFFF%uFFFF,證實是中文編碼錯解無誤。

解決方法很簡單,設法在傳回結果時強制宣告編碼方式為BIG5,讓XHR可以正確解讀即可。由於只打算傳回單純文字,因此沒法用<meta http-equiv=”content-type”>宣告編碼,所幸ASP裡還有Response.ContentType可用。ServerSide.asp程式改為:

<% Response.ContentType="text/plain; charset=big5”
Response.Write "作業成功" %>

HTML端就能正確承接結果囉。


Comments

# by silentbug

nice 不知道這招

Post a comment