html頁面傳遞中文引數發生亂碼問題
我們知道如果url地址中包含中文時,一般瀏覽器都會將其重新編碼成對應的字元。
一.URL編碼出現原因
URL 只能使用 ASCII 字符集來通過因特網進行傳送。 也就是說URL只能使用英文字母、阿拉伯數字和某些標點符號,不能使用其他文字和符號 。這意味著 如果URL中有漢字,就必須編碼後使用。但是麻煩的是 標準的國際組織並沒有規定具體的編碼方法,而是交給應用程式(瀏覽器)自己決定。這導致”URL編碼”成為了一個混亂的領域。
二.URL編碼解決方案
Url編碼通常也被稱為百分號編碼,是因為它的編碼方式非常簡單,使用%百分號加上兩位的字元——0123456789ABCDEF——代表一個位元組的十六進位制形式。Url編碼預設使用的字符集是US-ASCII。例如a在US-ASCII碼中對應的位元組是0x61,那麼Url編碼之後得到的就是%61,我們在位址列上輸入
對於非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>