单个值,还是整条网址
两种模式的分别就在这五个字符上:&、=、?、/、#。
单个值会把它们统统转掉。要放进参数里面的东西就用它,比如搜索词或跳转地址。把一条没转义的网址接在 ?next= 后面,里面的 & 会被当成新参数的开头,值就从那里断了。
整条网址保留这些搭骨架的字符。手上已经有一条能用的网址,只想收拾里面的空格和中文时用它。整条地址走这个模式,https:// 里的斜杠原样保留,链接照常能点。
拿不准时只看一条:在拼网址的一部分就用单个值,手上已经是一条网址就用整条网址。
空格是 + 还是 %20
两种都见得到,但各有各的地盘。%20 是标准写法,在网址任何位置都成立。+ 来自更早的 HTML 表单编码,只有在查询串里才算空格。
路径里的 + 就是加号本身。用表单规则去解码带加号的文件名,文件就被悄悄改了名。这个工具按标准来,空格转成 %20。
被编码了两次的值
解码之后如果还剩下 %2520 或 %253A,说明这个值被编码了两次:第二遍把 % 本身也转成了 %25。
多半是代码把一个已经编码过的值又编码了一遍。再解一次就能拿到原文,但真正该做的是定下在哪里编码:在把值放进网址的那一处编码一次,前后各段都传原始文本。
不会被转换的字符
A-Z、a-z、0-9 以及 -、.、_、~ 是规范认定安全的字符,会原样留下。它们没变不是漏了。
一个汉字在 UTF-8 里是 3 个字节,所以会变成 %E4%B8%AD 这样的三段。编码后的网址忽然变长,原因就在这里。