IE七、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=535javascript

轉自:http://blog.csdn.net/lucky8star/article/details/5575427java

相關文章
相關標籤/搜索