JavaScript中的URL编码:如何处理和转义非ASCII字符
星期五, 1月 3, 2025 | 1分钟阅读 | 更新于 星期五, 1月 3, 2025
1. 字符的码点
首先,字符 "中" 是一个汉字,其Unicode码点为 U+4E2D。在十六进制中,U+4E2D 对应的数字是 0x4E2D。Unicode是字符集的标准,每个字符都对应一个唯一的码点。
2. 编码的规则
UTF-8是一种可变长度的字符编码方案,采用1到4个字节来表示字符。对于字符 "中",其Unicode码点 U+4E2D 落在 0x0800 到 0xFFFF 的范围内,因此它将使用3个字节来进行编码。
UTF-8编码规则简述:
- 1字节编码 :适用于Unicode范围从
0x0000到0x007F(即ASCII字符),用一个字节表示,格式为:0xxxxxxx - 2字节编码 :适用于Unicode范围从
0x0080到0x07FF,用两个字节表示,格式为:110xxxxx 10xxxxxx - 3字节编码 :适用于Unicode范围从
0x0800到0xFFFF,用三个字节表示,格式为:1110xxxx 10xxxxxx 10xxxxxx - 4字节编码 :适用于Unicode范围从
0x10000到0x10FFFF,用四个字节表示,格式为:11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
3. 字符 "中" 的UTF-8编码过程
对于字符 "中",其Unicode码点为 U+4E2D,因此我们需要按照UTF-8的3字节编码规则进行编码。
-
获取Unicode码点 :
"中"的Unicode码点是U+4E2D,十六进制值为0x4E2D。
-
转换为二进制 :
- 将
0x4E2D转换为二进制:0x4E2D=0100 1110 0010 1101(16位二进制表示)
- 将
-
按照UTF-8编码格式进行编码 :
- 根据UTF-8的规则,
U+4E2D需要用三个字节来表示。 - UTF-8的3字节格式是:
1110xxxx 10xxxxxx 10xxxxxx - 将二进制数
0100111000101101填入到上述格式中:- 第一个字节 (
1110xxxx):将0100111放入xxxx部分,得到11100100。 - 第二个字节 (
10xxxxxx):将001011放入xxxxxx部分,得到10111000。 - 第三个字节 (
10xxxxxx):将101101放入xxxxxx部分,得到10101101。
- 第一个字节 (
这样,
U+4E2D的UTF-8编码就为:1110 0100 1011 1000 1010 1101 - 根据UTF-8的规则,
-
转换为十六进制 :
- 将每个字节转换为十六进制表示:
11100100→E410111000→B810101101→AD
所以,字符
"中"的UTF-8编码是:E4 B8 AD。 - 将每个字节转换为十六进制表示:
4. 转换为URL百分号编码
在URL编码中,所有非ASCII字符(包括UTF-8编码的字符)都需要转换成百分号编码格式,即将每个字节转换为 % 后跟上该字节的十六进制值。因此,UTF-8编码的 E4 B8 AD 将被转换为URL编码格式:
E4→%E4B8→%B8AD→%AD
最终,字符 "中" 的URL编码就是:%E4%B8%AD
5. 总结过程
总结一下字符 "中" 从Unicode到UTF-8编码,再到URL百分号编码的完整过程:
- 获取字符的Unicode码点:
U+4E2D。 - 将Unicode码点
U+4E2D转换为二进制:0100111000101101。 - 根据UTF-8编码规则,将二进制值转换为3字节:
E4 B8 AD。 - 将每个字节转换为URL百分号编码:
%E4%B8%AD。
6. JS代码示例
JavaScript提供了两个主要函数来进行URL编码:
- encodeURIComponent():编码单个URL组件(如查询参数、路径段等)。
- encodeURI():编码整个URL,但不会编码已是URL合法的字符,如冒号(:)、斜杠(/)等。
const str = '中';
const encodedStr = encodeURIComponent(str);
console.log(encodedStr); // 输出: %E4%B8%AD
结论
通过以上详细过程,我们可以看出UTF-8编码采用变长字节表示方式,字符 "中" 使用了3个字节进行编码。而URL编码则将这些字节转换为百分号表示,从而保证了字符可以在网络中正确传输并被解析。希望这个过程帮助您更好地理解UTF-8编码和URL编码的实现原理。