urlencode

在1994年订立的RFC1738中。对字符串中除了-_.三个字符之外的所有非字母数字字符都替换成百分号(%)后跟两位十六进制数。十六进制数中字母必须为大写。
http://tools.ietf/html/rfc1738

在2005年定义的RFC3986中,将针对- _.~(扩充了一个波浪线字符)四个字符之外的所有非字母数字字符进行百分号编码。

http中的urlencode

在W3C找到HTML标准的说明 http://www.w3/TR/REC-html40/interact/forms.html#h-17.13.4
在这里清楚的看到编码方式是根据ContextType的不同而区别对待的,在form的ContextType是[x-www-form-urlencoded]的时候会对form中的键/值对进行编码,空格被转义成+,其他字符按照[RFC1738]标准处理成%HH的形式。

编程语言中urlencode的实现

java


java中的UrlEncode是实现http协议form表单的标准,因此把空格转换成+,而没有提供类似php中rawurlencode的实现(RFC1738标准)

php

在php当中也提供了标准的RFC1738的实现
在PHP Manual中有对两个函数的说明:

urlencode:返回字符串,此字符串中除了 - _ . 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+)。此编码与 WWW 表单 POST 数据的编码方式是一样的,同时与 application/x-www-form-urlencoded 的媒体类型编码方式一样。由于历史原因,此编码在将空格编码为加号(+)方面与 RFC1738 编码(参见 rawurlencode())不同。

rawurlencode:返回字符串,此字符串中除了 - _ . 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数。这是在 RFC 1738 中描述的编码,是为了保护原义字符以免其被解释为特殊的 URL 定界符,同时保护 URL 格式以免其被传输媒体(像一些邮件系统)使用字符转换时弄乱。

http服务器支持

get请求query string或者form表单post提交时,客户端默认会进行urlencode,http服务器获取请求参数或者表单内容时默认进行urldecode。因此如果参数中含有空格或者加号时如果一端手动进行urlencode时,另一端要手动进行urldecode

例如,使用postman发送form表单提交(x-www-form-urlencoded),

原始参数:
app_id:123
sign:g952eLOp/zY942ACbtuaJk1L57W+OOh1A5rGJJzigX6y95dJ BjA020lIoxyHW62jU=

post body体的格式
app_id=123&sign=g952eLOp%2FzY942ACbtuaJk1L57W%2BOOh1A5rGJJzigX6y95dJ+BjA020lIoxyHW62jU%3D

/ 转换成 %2F
+ 转换成 %2B
空格 转换成 +
= 转换成 %3D


controller层已经是urldecode后的数据了

更多推荐

URLEncode与Java中的URLEncode