关于 URI 编码

in #cn-programming5 years ago

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)

Sort:  

I 'm Myanmar. I want to fiiendship you.