URL 编码也被称为百分号编码。
URL 编码的规则:简单来说,如果需要对一个字符进行 URL 编码,首先需要判断该字符是否是 ASCII 字符:
技术是为了解决问题而生的,URL 编码的作用是:使用 “安全的字符”(允许出现的字符、无歧义的字符) 替换 “不安全的字符”(不允许出现的字符、有歧义的字符)
URL 编码需要遵循 RFC 3986 标准。RFC 3986: Uniform Resource Identifier (URI): Generic Syntax (rfc-editor.org)
RFC3986 协议规定 URL 只允许包含两类字符:“保留字符” 和 “未保留字符”。“保留字符” 和 “未保留字符” 都属于是 ASCII 字符。
对 “保留字符” 进行 URL 编码:如果一个 “保留字符” 在特定上下文中具有特殊含义,并且 URL 中必须使用该 “保留字符” 用于其它目的,那么必须对不表示特殊含义的 “保留字符” 进行 URL 编码。(比如,斜线字符 / 用于 URL 不同部分的分界,但是斜线字符 / 又需要出现在 URL 一个路径成分的内部)
URL 编码一个 “保留字符”,首先需要把该 “保留字符” 的 ASCII 的值表示为两个 16 进制的数字,然后在其前面放置转义字符 %,置入 URL 中的相应位置。(比如,URL 编码斜线字符 /,斜线字符 / 的 ASCII 的值为 47,10 进制的 47 等于 16进制的 2F,因此斜线字符 / 经过 URL 编码后为 %2F)
对 “未保留字符” 进行 URL 编码: “未保留字符” 不需要进行 URL 编码。如果两个 URL 的差别仅在于 “未保留字符” 是用 URL 编码还是用字符自身表示,那么这两个 URL 具有等价的语义。
对 “百分号 %” 进行 URL 编码:由于 “百分号 %” 用于 URL 编码,因此用于 URL 内部的 “百分号 %” 应该被编码。 “百分号 %” 的 URL 编码结果为 "%25"。
对任意数据进行 URL 编码:
encodeURI() 和 encodeURIComponent() 这两个方法是 JavaScript 中进行 URL 编码的方法。
介绍 encodeURI() 方法:
介绍 encodeURIComponent() 方法:
https://www.w3.org/TR/html4/interact/forms.html#h-17.13.4.1
当 HTML 表单中的数据被提交时,表单的域名与值被编码并通过网络把数据发送给服务器。这里的编码方法采用了一个非常早期的通用的 URL 编码方法,并且有很多小的修改,如换行规范化 以及 把空格符的编码 "%20" 替换为 "+"。按这套方法编码的数据的 MIME 类型是 application/x-www-form-urlencoded,当前仍用于 HTML 与 XForms 规范中。
如果发送的是 HTTP GET 请求,application/x-www-form-urlencoded 数据包含在所请求 URL 的查询参数中。如果发送的是 HTTP POST 请求,数据被放置在请求主体中,媒体类型的名字被包含在 Content-Type 请求首部字段。
Java 中的 URLEncoder.encode() 方法把 “空格符” 编码为"+",而不是 "%20"。
如果我们把带空格的字符串的编码结果发送给前端。前端调用 decodeURIComponent() 解码时,加号 + 将无法解码为空格。
// encode = say+hello
String encode = URLEncoder.encode("say hello", Charset.defaultCharset().displayName());
解决方案:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。