关于encodeURIComponent编码非UTF-8字符时出现的怪异情况

Posted ryzz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于encodeURIComponent编码非UTF-8字符时出现的怪异情况相关的知识,希望对你有一定的参考价值。

现在有个test.html文件,这个文件的编码是UTF-8,其中“你好”的UTF-8编码是:E4 BD A0 E5 A5 BD,文件代码如下:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<script>
	console.log(encodeURIComponent("你好")); //%E4%BD%A0%E5%A5%BD
</script>
</head>
<body>
	<p>hello你好</p>
</body>
</html>

可以看见,enencodeURIComponent就是将“你好”以UTF-8编码输出(这也正是encodeURIComponent方法的定义:将非URI字符都以UTF-8编码的格式输出为字符串),现在来看一个怪异的情况,还是上面的test.html(所以文件的编码依旧是UTF-8),只不过这次手动把charset改为了GBK编码,用来误导encodeURIComponent方法,代码如下:

<!DOCTYPE html>
<html>
<head>
<meta charset="GBK">
<script>
	console.log(encodeURIComponent("你好")); //%E6%B5%A3%E7%8A%B2%E3%82%BD
</script>
</head>
<body>
	<p>hello你好</p>
</body>
</html>

什么,输出的是什么鬼!不着急,我们慢慢分析:
encodeURIComponent认为需要encode的字符的编码是charset指定的编码,这里就是GBK,而encodeURIComponent需要的是UTF-8编码的字符,这样它才会进行encode,所以必须发生编码之间的转换,具体如下,
“你好”的UTF-8:E4 BD A0 E5 A5 BD
所以“你好”实际上是以上面的6字节存储在文件test.html里面(因为文件的实际编码是UTF-8)
但是charset指定的GBK是2字节编码(除128个ASCII外,都是2字节编码),所以它把E4 BD认为是1个GBK字符,尝试把它转为UTF-8,其中E4 BD在GBK中对应的是“浣”字,而这个字在UTF-8则是E6 B5 A3
由此问题解决!

以上是关于关于encodeURIComponent编码非UTF-8字符时出现的怪异情况的主要内容,如果未能解决你的问题,请参考以下文章

encodeURI()和encodeURIComponent() 区别

1.全局函数

url的三个js编码函数escape(),encodeURI(),encodeURIComponent()简介

url的三个js编码函数escape(),encodeURI(),encodeURIComponent()简介

encodeURIComponent编码后java后台的解码

关于编码异常