URL 的严苛安检
👮♂️
站住!我是 URL 安检员。根据《互联网交通法》,URL 只能包含 ASCII 字符。
那个带空格的,还有那个中文汉字,你们不能直接上车!
😨
啊?可是我的名字就叫 "My File.txt",中间有个空格啊!
🕵️
别担心,我有伪装工具。只要换个装,安检员就认不出你了。
来,穿上这件 %20 的风衣。
// 伪装前
https://www.example.com/My File.txt
// 伪装后
https://www.example.com/My%20File.txt
URL 编码(URL Encoding)将非 ASCII 字符转换为 % 后跟两位十六进制数字的格式。
比如空格通常编码为 %20 或 +。
常见字符的伪装
📋
这里有一份"通缉名单",这些家伙经常需要伪装:
| 原身 |
伪装代号 |
描述 |
| (空格) |
%20 |
最常见的隐形人 |
| / |
%2F |
路径分隔符 |
| ? |
%3F |
查询开始符 |
| & |
%26 |
参数连接符 |
| = |
%3D |
赋值符 |
JS 里的伪装大师
🧙♂️
JavaScript 提供了两位顶级的伪装大师(函数):
1. encodeURI():轻量级伪装,不碰 http:// 这些关键部位。
2. encodeURIComponent():全副武装,连亲妈都不认识,适合处理参数值。
var url = "https://www.example.com/search?q=hello world&lang=zh";
// 1. encodeURI() - 适合整个 URL
// 结果: https://www.example.com/search?q=hello%20world&lang=zh
// 注意:它没动 : / ? = & 这些结构符号
// 2. encodeURIComponent() - 适合参数值
// 如果你对整个 URL 用这个...
// 结果: https%3A%2F%2Fwww.example.com%2Fsearch%3Fq%3Dhello%20world%26lang%3Dzh
// 😱 糟了!连 http 的冒号都被转义了,浏览器看不懂了!
💡
正确用法:
只对参数部分使用 encodeURIComponent!
var baseUrl = "https://www.example.com/search";
var query = "hello world";
var finalUrl = baseUrl + "?q=" + encodeURIComponent(query);