URI 编码
URI 中的一些字符被保留来用作分隔符, 比如 `/`, `:` 用来指明协议, `?` 用来分割 path 和 querystring, `&` 用来分割 querystring 中的不同参数, `=` 用来分割每个参数的键和值. 其它还有很多.
那么问题来了, 如果我们想在 URI 中正常使用这些保留字符该怎么用呢? 比如说我们就是想在参数得值中包含 `&` 字符:
http://127.0.0.1:8080/index.php?key1=value1&key2=value2&value3
如果不做其他处理, 就这样直接请求这个 URI 的话, `key2=value2&value3` 将会被当做两个参数, 其中一个参数键为 key2, 值为 value2, 另一个参数键为 value3, 没有值.
那么怎么办呢, RFC3986 已经给出了解决方法, 就是在我们想正常使用这些特殊字符的时候用 `%HH` 的方式编码它们.
其它需要编码的字符
RFC3986 中定义了保留字符, 这些字符必须被编码; 还定义了非保留字符, 这些字符完全没必要被编码, 但是你硬要编也可以. 最后剩下的字符不属于这两类, 但是也可能需要被编码. 比如 `%` 本身, 因为 `%` 被做编码的前缀了, 所以如果我们的数据中要包含 `%` 的话必须也对它编码.
关于空格
关于空格为什么需要被编码, 可以看这里:
http://www.blooberry.com/indexdot/html/topics/urlencoding.htm
空格字符在 RFC3986 中规定是应该编码成 `%20` 的, 但是在 `application/x-www-form-urlencode` 这种内容类型中是被编码成 `+` 的. (但是仅限于 querystring 或者 post data: http://stackoverflow.com/questions/2678551/when-to-encode-space-to-plus-or-20)
I 'm Myanmar. I want to fiiendship you.