关于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
由此问题解决!

猜你喜欢

转载自www.cnblogs.com/ryzz/p/12606447.html