1. 程式人生 > >IE7、IE8下使用escape、encodeURI傳遞中文引數亂碼的問題及解決方案

IE7、IE8下使用escape、encodeURI傳遞中文引數亂碼的問題及解決方案

js跳轉到指定頁面,一旦escape()中文資料,瀏覽器就會終止和沒有反應。上網搜了半天始終不得解。一種說法是,escape中文之後,url中出現了%u,IE7和IE8拒絕執行。目前看來差不多是這樣的。

不得已,只好使用encodeURI(),但是asp並不能接受encodeURI的中文,而是解析成亂碼。於是又上網搜了半天,始終不得解。應該是asp以及vbscript中並沒有這樣的內建函式。

於是不得不開始了漫長的尋找解決方案之路。

我們先來看。IE8必將取代成為主流,而IE8不支援escape,所以只有採用encodeURI和encodeURIComponent而放棄escape,對應的解碼函式為:decodeURI和decodeURIComponent。

而現在的問題是,通過js用encodeURI或encodeURIComponent編碼後的資料是以utf-8的方式編碼的,而asp程式對utf-8支援很差,通常是gb2312的,於是伺服器端將以utf-8格式編碼的資料,以asp自身的server.urlencode的方式進行解碼、而且這個過程是自動的、沒有找到干預的辦法,這樣資料流經過這樣的折騰,已經亂了,解析出來的中文必然是亂碼。

假設asp沒有自動解碼,問題就好處理了。在伺服器端呼叫js的decodeURI或decodeURIComponent函式,就可正確識別中文,因為他們才是對應匹配的。程式碼如下:
<script language="javascript" type="text/javascript" runat="server">function mydecodeurl(s){return decodeURIComponent(s);}</script>
這樣的程式在asp中是可以直接呼叫的,如<%= mydecodeurl(string) %>

但是能不能讓asp不自動解碼呢?我認為是asp的設計機制就是這樣的,即便是可以讓其不自動解碼,但是很可能面臨新的問題,所以這不是一個好辦法。

苦思了許久,想到一個變通的辦法,在各個瀏覽器上測試通過。

使用encodeURI和encodeURIComponent函式編碼過的中文是形如"%E7%94%B5%E8%84%91",asp自動解碼是因為asp認為它和server.urlencode編碼過的形式差不多,以為是自家的東西,結果就一廂情願的給解碼了。現在我們稍微處理一下,把其中的"%"用js替換成"$",即為"$E7$94$B5$E8$84$91",然後在js提交給asp,親愛的看到什麼了嗎,asp不再強行解碼了!剩下的問題就很簡單了,用asp的replace再把"$"替換回"%",然後在伺服器端執行js的decodeURI或decodeURIComponent函式,問題解決。

核心程式碼:
客戶端提交時js處理(string為含中文的要處理的字串):encodeURIComponent(string).replace(/%/g,'$')
伺服器端接收並解碼:
<script language="javascript" type="text/javascript" runat="server">function mydecodeurl(s){return decodeURIComponent(s);}</script>
<%
response.write mydecodeurl(replace(string,"$","%"))
%>

本文網址: http://www.lantian360.com/blueblog/blog.asp?id=535