哪些字符需要编码
RFC3986文档规定,url中只允许包含英文字母、数字、-_.~四个特殊字符以及所有保留字。其余字符均需要经过percent encode编码。
保留字
| 保留字 | 特殊含义 | percent encode编码值 |
|---|---|---|
| + | 表示空格(在url中不能使用空格) | %2B |
| / | 分割目录和子目录 | %2F |
| % | 指定特殊字符 | %25 |
| # | 表示书签 | %23 |
| & | 参数间的分隔符 | %26 |
| = | 用于指定参数的值 | %3D |
如何对url中的非法字符进行编码
url编码通常也称为百分号编码,是因为它的编码方式非常简单,使用百分号加上两位的字符(0123456789ABCDEF)来表示一个字节的十六进制形式。例如“网易”的url编码为:%e7%bd%91%e6%98%93,其中的“e7 bd 91 e6 93”为“网易”的UTF8字节流。
url编码默认使用的字符集是US-ASCII。例如“a“在ASCII码中对应的字节是0x61,那么url编码后得到的就是”%61“;又如”@“符号在ASCII码中对应的字节是”0x40“,经过url编码后得到的是”%40“。
对于非ASCII字符,需要使用ASCII字符集的超集进行编码得到相应的字节,然后对每个字节进行百分号编码。对于Unicode字符,RFC文档建议使用UTF-8对其进行编码得到相应的字节,然后对每个字节执行百分号编码。例如”中文“使用UTF-8字符集得到的字节流(由多个字节组成,因为一个字节无法表示“中文”)为”0xE4 0xB8 0xAD 0xE6 0x96 0x87",经过url编码后得到“%E4%B8%AD%E6%96%87”
另外,很多http监视工具或浏览器地址栏等在显示url时会自动进行一次url解码(使用UTF-8字符集),这就是为什么在浏览器地址栏中搜索中文的时候,地址栏显示的url包含中文的缘故。但实际上发送给服务端的原始url是经过编码的。
其他
有些时候我们会遇到用某编辑器打开项目工程后,出现乱码的现象。其实这也是编码捣的鬼,因为计算机在存储文件或文件文本时需要对其进行编码,那么如果在编码时用的是字符集A,而编辑器打开工程后用了字符集B来进行解码翻译,那无疑会出现乱码。所以遇到这种现象通常是因为编辑器与工程文件使用的字符集不一致导致的。