URL 编码
为何要对 URL 编码
1. 防止剖析毛病
我们的 queryString 的情势是运用 ?最先, key=value 通报参数, key-value pairs 之间运用 & 衔接.
比方:
?postid=5038412&t=1450591802326
服务器会
依据 & 剖析 key-value pairs
依据 = 剖析 key,value
那末假如 key或许 value 中存在 =,&, 那末就会剖析挂掉,
比方 宝洁公司叫做 P&G
?name=P&G&t=123456
服务器剖析的时刻就会剖析毛病:
name=P
G //到这里就挂掉了
2. 防止不法字符
URL 只能运用 ASCII 字符集, 一切的非 ASCII 码都算是不法字符.
在这个定义中, 一切的中文都算是不法字符.
URL 的编码划定规矩
平常运用的是 百分号编码(percent-encoding)
划定规矩:
是不是是 ASCII 字符
是
取对应的字节编号, 比方 'a' 对应的是 '0x61', 那末编码以后就是 %61
否
运用 utf-8 对其举行编码
比方"中文"运用UTF-8字符集获得的字节为 0xE4 0xB8 0xAD 0xE6 0x96 0x87,
经由Url编码以后获得"%E4%B8%AD%E6%96%87".
现实情形
浏览器会默认给 URL 编码, 然则差别浏览器的编码完成体式格局不一致, 所以最好的体式格局就是:
我们本身经由过程 JS 对 URL 举行编码
JS 用来编码的函数有 3 个:
// escape() // 不引荐运用, 缘由不明.
encodeURI()
encodeURIComponent()
encodeURI 会对全部 URL 中的不法字符编码 (它是为了处理不法字符)
encodeURIComponent 会对一切的保存字都编码 (处理剖析毛病的题目)
所以终究的编码体式格局是:
对每个 key-value 举行 encodeURIComponent 编码
对全部 URL 举行 encodeURI 编码
备注:
URL 中的字符能够分红三类:
保存字符 (reserved characters):
这类字符是URI中的保存症结字符,它们用于支解URI中的各个部份。
这些字符是: ;, /, ?, :, @, &, =, +, $, ,
Mark字符 (mark characters)
这类字符在RFC-2396中迥殊定义,然则没有迥殊申明用处,多是和别的RFC规范相干。
这些字符是:-, _, ., !, ~, *, ‘, (, )
一般字符
URL 编码解码的题目
既然浏览器会默认给 URL 举行编码, 那末服务器就会默认给URL 解码。
假如我们仅仅是对 URL 举行 encodeURI, 那末服务器在解码的时刻能够一般, 然则剖析的时刻照旧不能
辨别 & 究竟是支解符照样 value 中的一个一般字符, 所以我们需要对 key-value pairs 举行编码的.
终究结论
运用 encodeURIComponent 防止参数剖析毛病
运用 encodeURI 防止不法字符