ASP下Ajax的GB2312編碼問題

被編碼問題困擾了1天了,找到了幾個解決方案,雖然問題沒有最終解決,但可以爲以後編寫ajax應用提供一些參考。

 


 

廢話少說,先簡要描述一下問題所在:

JS 內部使用UTF-8 編碼,本身js用GB2312書寫。ASP 輸出使用GB2312,Codepage = 936

JS -> ASP ,escape後的程序以utf-8編碼發送給asp,asp端必須進行編碼轉換。

ASP -> JS ,asp輸出的編碼爲gb2312,js默認以UTF-8接收並顯示。可以用Js的GB2UTF8函數在客戶端進行編碼轉換。轉換後之前js提交的utf8參數亂碼,asp內部的中文字符串正常顯示

 


 

解決方案如下:

1. 服務器端純用utf-8編碼,設置response.contentType="text/html;charset=utf-8" 並且設置html頁面的meta頭爲utf-8編碼。js端使用escape或者encodeURIComponent 對參數進行編碼均可。

優點:不用再被編碼問題困擾

缺點:

  1. asp調試比較痛苦,輸出的asp錯誤均爲gb2312編碼……在utf-8頁面上顯示亂碼。
  2. 如果是在原有的系統上修改,凡是含有中文字符變量的包含文件,都必須以utf-8另存一份出來

2. 搜到的一個還不錯的方法。但是仍然因爲往現有的系統中套用麻煩而捨棄。引用自 http://www.dc9.cn/post/295.html

js端

使用下面的方法進行編碼

<script language="javascript">
encodeURIComponent(escape(xxxxxxx));
</script>

 

asp端

Response.CodePage=936
Response.Charset="gb2312"

 使用以下函數進行解碼

<script language="javascript" runat="server">

  
function vbsunescape(source){
    
return unescape(source);
  }


</script>

優點:近乎於完美解決亂碼問題,包括髮送和接收以及頁面回顯

缺點:

  1. 服務器端需要混用javascript編碼,服務器端程序效率低
  2. 每個參數都需要使用 vbsundescape 轉換一次

這樣就已經基本可以了。

 


 

小結:

以上兩種方法均不適合現有系統的改造……於是決定放棄ajax計劃……

 


 

後記:

最後還是找到了方法,雖然有點衰~

1. 關於asp->js輸出亂碼問題:

因爲對於xml,XMLHttp可以根據其指定編碼自動轉換,所以就利用這個來做。在asp頁面清除掉原來的信息輸出,改爲:

<%
response.codepage
="936"
response.ContentType 
= "text/xml;charset=gb2312"
response.charset(
"gb2312")
Response.Clear
%
><?xml version="1.0" encoding="GB2312"?>
<Contents>
<Content>
<![CDATA[

尾部添加:

]]>
</Content>
</Contents>

用XMLHttpRequest.responseXML獲取得到的數據, XHR.responseXML.selectSingleNode("Contents/Content") 下的第一個nodeType==4 的 childNode 的nodeValue就是返回的代碼……用什麼套都無所謂了現在……關於查找這個CDATA區塊的方法,從XPath裏可能還有更好的方法,現在暫用程序循環獲得:

for(var i=0;i<content.length;i++)
    
if(content[i].nodeType==4){result = content[i].nodeValue;}

2. 關於提交的亂碼問題:

之前一直依賴於使用的MochiKit框架的queryString方法。後將其修改,在 MochiKit/Base.js 中 862行的 queryString函數複製爲queryString2 ,修改 892 行 的 rval.push中 的 urlEncode 爲 escape 即可。並在大約1000行左右的 MochiKit.Base.EXPORT 數組中的適當位置添加 "queryString2" 使之成爲全局函數。

 以上二者結合即可完全搞定編碼問題

發佈了40 篇原創文章 · 獲贊 1 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章