1. 程式人生 > >html頁面傳遞中文引數發生亂碼問題

html頁面傳遞中文引數發生亂碼問題

我們知道如果url地址中包含中文時,一般瀏覽器都會將其重新編碼成對應的字元。

一.URL編碼出現原因
URL 只能使用 ASCII 字符集來通過因特網進行傳送。 也就是說URL只能使用英文字母、阿拉伯數字和某些標點符號,不能使用其他文字和符號 。這意味著 如果URL中有漢字,就必須編碼後使用。但是麻煩的是 標準的國際組織並沒有規定具體的編碼方法,而是交給應用程式(瀏覽器)自己決定。這導致”URL編碼”成為了一個混亂的領域。

二.URL編碼解決方案

Url編碼通常也被稱為百分號編碼,是因為它的編碼方式非常簡單,使用%百分號加上兩位的字元——0123456789ABCDEF——代表一個位元組的十六進位制形式。Url編碼預設使用的字符集是US-ASCII。例如a在US-ASCII碼中對應的位元組是0x61,那麼Url編碼之後得到的就是%61,我們在位址列上輸入

http://g.cn/search?q=%61%62%63,實際上就等同於在google上搜索abc了。又如@符號在ASCII字符集中對應的位元組為0x40,經過Url編碼之後得到的是%40。

對於非ASCII字元,需要使用ASCII字符集的超集進行編碼得到相應的位元組,然後對每個位元組執行百分號編碼。對於Unicode字元,RFC文件建議使用utf-8對其進行編碼得到相應的位元組,然後對每個位元組執行百分號編碼。如”中文”使用UTF-8字符集得到的位元組為0xE4 0xB8 0xAD 0xE6 0x96 0x87,經過Url編碼之後得到”%E4%B8%AD%E6%96%87”。

三.中文引數編碼

瀏覽器中位址列出現的中文引數在向後臺提交引數時,瀏覽器會自動將中文進行編碼再向後臺提交資料。

我們假設需要將a頁面中的引數傳遞中b頁面中。

a頁面如下:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Test</title>
</head>
<body>
    <div id="main" style="width: 850px; height: 500px">
    <a href="b.html?abc=南京">向b頁面傳遞引數</a>
    </div>
</body
>
</html>

b頁面如下:

<html>
<meta charset="utf-8">
<script>
function getParams(key) {
    var reg = new RegExp("(^|&)" + key + "=([^&]*)(&|$)"); 
   //如果位址列中出現中文則進行編碼    
    var r = encodeURI(window.location.search).substr(1).match(reg);  
    if (r != null) {  
        //將中文編碼的字元重新變成中文
        return decodeURI(unescape(r[2]));  
    }  
    return null;  
};
data=getParams("abc")
alert(data)
</script>
</html>