关于地址栏传中文参数乱码的解决办法

时间:2022-08-27 22:08:15

首先,地址栏传中文是很不明智的,因为不同的浏览器对与中文的解析存在不同的方法。所以,建议如果能不用尽量不要用。

当然,很多时候奇葩需求要求我们必须解决这个办法。

下面,是解决个别奇葩需求的方法。

在中文参数加入到地址栏之前进行转码。(注意,简单转码是不可以的,浏览器会根据编码方式对已经编码的部分进行一次反编译。)


正确方法是:

在中文加入到地址栏前,进行两次encodeURI转码

在传输过程中浏览器会解析一遍,到达指定页面获取地址栏参数的时候,再进行一次decodeURI解码就可以了。

如果上面比较赘余的话,下面是a.html和b.html,可以通过例子查看如何实现

a.html

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
	</body>
	<script type="text/javascript">
		//这是第一个页面a.html
		//通过地址栏传参的方式设置第二个页面b.html的标题为:中文
		var title = "中文";
		var _t = encodeURI(encodeURI(title));
		window.location.href = "b.html?title="+_t;
	</script>
</html>
b.html

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
	</body>
	<script type="text/javascript">
		var _t = getQueryString("title"); //获取地址栏参数
		var title = decodeURI(_t); //只需要转一次码
		document.getElementsByTagName("title")[0].innerHTML = title;
		//获取地址栏参数的方法
		function getQueryString(name) {
			var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
			var r = window.location.search.substr(1).match(reg);
			if (r != null) return unescape(r[2]); return null;
		}
	</script>
</html>

把a.html和b.html复制到同一目录下,打开a.html即可看到效果。实测IE,Chrome,Fire Fox等主流浏览器均没有问题。