为什么要对URI进行编码?
传递数据中,如果存在用作分隔符的保留字符应该怎么办?
对可能产生歧义性的数据编码
- 不在ASCII码范围内的字符 (ASCII等字符编码详解:https://blog.csdn.net/Deft_MKJing/article/details/79460485)
- ASCII码中不可显示的字符
- URI中规定的保留字符
- 不安全字符(传输环节中可能会被不正确处理),如空格、引号、尖括号等
如:
https://www.baidu.com/s?wd=?#!
https://www.baidu.com/s?wd=冯小圆 博客
https://www.baidu.com/s?wd=小圆 ‘>博客
保留字符与非保留字符
保留字符:
reserved = gen-delims / sub-delims
- gen-delims = ":" / "/" / "#" / "[" / "]" / "@"
- sub-delims = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "=" / ";" / ","
非保留字符:
unreserved = APLHA / DIGIT / "-" / "_" / "." / "~"
- APLHA :%41-%5A and %61-%7A
- DIGIT:%30-%39
- -: %2D .:%2E _:%5F
- ~: %7E ,某些实现将其认为保留字符
百分号编码方式:
pct-encoded = "%" HEXDIG HEXDIG
- US-ASCII : 128个字符(95个可显示字符,33个不可显示字符)
- 参见:https://baike.baidu.com/item/ASCII/309296?fr=aladdin
对于HEXDIG 十六进制中的字母,大小写等价
非ASCII码字符(例如中文):建议先UTF-8编码,再 US-ASCII 编码
对于URI合法的字符,编码和不编码是等价的
例如,"URI转换"既可以是"URI%e8%bd%ac%e6%8d%a",也可以"%55%52%49%e8%bd%ac%e6%8d%a"