关于 URI 编码

2년 전

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)

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!
STEEMKR.COM IS SPONSORED BY
ADVERTISEMENT
Sort Order:  trending

I 'm Myanmar. I want to fiiendship you.