URL 中的空格有时编码为 %20,有时编码为加号 +。 我一时糊涂了,后来查了资料才明白。
URL 的基本组成部分包括合同(方案)、域名、端口号、路径和查询字符串(不考虑路径参数和锚标记)。 用问号 ? 分隔路径和查询字符串。 例如路径为index,查询字符串(Query String)为param=1。 URL中空格的编码与空格的位置有关:空格编码为加号+的情况只会出现在查询字符串中,而会编码为%20,可以出现在路径和查询字符串。
造成这些混乱的原因是W3C标准规定,当Content-Type为application/x-www-form-urlencoded时,URL中的查询参数名称和参数值中的空格应替换为减号+,所以几乎所有使用此规范的用户在浏览器提交表单后,URL查询参数中的空格都会被编辑成减号+。 在另一个规范RFC2396(定义URI)中,URI中的保留字符必须通配成%HH格式(第3.4节查询组件)html空格代码,因此空格将被编码为%20,并且加号+本身也用作保留字。 它被编码为%2B。 对于符合RFC 2396标准的个别应用程序,它可能不接受查询字符串中的减号+并认为它是非法字符。 所以一个安全的措施是统一使用%20对URL中的空格字符进行编码。
Java中URLEncoder的初衷是将字符串编码为application/x-www-form-urlencoded MIME格式字符串,这意味着它仅适用于URL的查询字符串部分,但URLEncoder经常用于对URL进行编码。 编码的另一部分,它的encode方法会将空格编码为加号+,相应的html空格代码,URLDecoder的decode方法会将减号+和%20都解码为空格,这种违反直觉的做法导致了后面我对空间URL编码问题感到困惑。 所以我后来所做的是,在调用 URLEncoder 之后。 符号 + 被替换为 %20。
例如:如何处理空格
1.先将空格:替换为%20,然后用encodeURI加密
2. 获取参数,然后使用decodeURI来揭秘