前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >空格URL编码的正确使用姿势

空格URL编码的正确使用姿势

作者头像
joymufeng
发布于 2018-05-17 07:17:10
发布于 2018-05-17 07:17:10
3.4K00
代码可运行
举报
运行总次数:0
代码可运行

1、简介

       空格目前有两种不同的编码方式,一种是在HTML4中定义的,而另一种是在RFC-3986中定义的。本文将简要介绍这两种编码方式,以及会给我们的开发工作带来什么样的问题,最后给出一些编码建议。

1.1 HTML4编码方式

HTML4的application/x-www-form-urlencoded一节对空格的编码定义如下:

  1. Control names and values are escaped. Space characters are replaced by `+', and then reserved characters are escaped as described in [RFC1738], section 2.2: Non-alphanumeric characters are replaced by `%HH', a percent sign and two hexadecimal digits representing the ASCII code of the character. Line breaks are represented as "CR LF" pairs (i.e., `%0D%0A').
  2. The control names/values are listed in the order they appear in the document. The name is separated from the value by `=' and name/value pairs are separated from each other by `&'.

    按照HTML4规范,空格应该被编码成加号"+",而如果字符本身就是加号"+",则应该被编码成%2B。

 1.2 RFC-3986编码方式

RFC-3986中采用统一的编码方式,字符的编码格式为:%HH(H为十六进制字符), 并没有对空格做特殊处理。按照RFC-3986规范,空格被编码成%20,而加号"+"被编码成%2B。

1.3 导致的问题

    从上面可以看出,空格在两种规范下有不同的编码方式,也因此导致我们在开发时会遇到意想不到的错误。例如用户明明提交的是"你 好",写入数据库之后却变成了"你+好",往往这种错误让人摸不着头脑,其实这就是由于空格的编码错误导致的。

2. 编码建议

    其实避免上面错误的方法很简单,就是在开发中我们要统一客户端和服务端的编码方式,而不能两者混用。建议客户端和服务端同时使用RFC-3986编码方式,将请求参数全部编码成%HH格式。当然为了保证正确的编码解码,统一的字符集也不可缺少,最好都使用UTF-8。

3. 编码示例

    如果客户端提交的查询字符串是"开源+中国 博客", 则HTML4采用UTF-8编码后结果为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
%E5%BC%80%E6%BA%90%2B%E4%B8%AD%E5%9B%BD+%E5%8D%9A%E5%AE%A2

    注意,加号被直接编码成%2B,而空格则被编码成了加号"+"。

  而RFC-3986采用UTF-8编码后结果为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
%E5%BC%80%E6%BA%90%2B%E4%B8%AD%E5%9B%BD%20%E5%8D%9A%E5%AE%A2

    加号被直接编码成%2B,空格也被直接编码成%20。

4. Java中的URL编码

    Java中常用的URL编码类有两个:一个是JDK自带的java.net.URLEncoder,另一个是Apache的org.apache.commons.codec.net.URLCodec。这两个类遵循的都是HTML4标准,即将空格编码成加号"+",代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//输出:%E4%BD%A0+%E5%A5%BD
System.out.println(java.net.URLEncoder.encode("你 好", "utf-8"));
URLCodec en = new URLCodec("utf-8");
//输出:%E4%BD%A0+%E5%A5%BD
System.out.println(en.encode("你 好"));

   其实要将HTML4的编码结果转换成RFC-3986编码,方法很简单:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java.net.URLEncoder.encode("你 好", "utf-8").replaceAll("\\+", "%20");

   另外Netty中有一个QueryStringEncoder类可以可以实现RFC-3986的URL编码,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
QueryStringEncoder encoder = new QueryStringEncoder("/");
encoder.addParam("name", "开源+中国 博客");
//输出:/?name=%E5%BC%80%E6%BA%90%2B%E4%B8%AD%E5%9B%BD%20%E5%8D%9A%E5%AE%A2
System.out.println(encoder.toUri());

5. 参考

URI Escaping and java.net.URLEncoder

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
URL编码中的空格(编码以后变为+)
最近测试MM反映查看Log的时候会在有些请求中看到“+”,但是最后的结果却没有问题。当时感觉很诡异,走读代码定位发现是因为调用了java.net.URLEncoder的方法出现。后来研究发现才发现没这么简单啊。 总结:在HTML4.0.1中,基于RFC-1738标准,‘ ’在URL编码以后为 ‘+’,只有JS中由于基于RFC-2396标准,‘ ’在URL编码以后为‘%20’。 java代码: 代码片段: String tempString = "Hello, World!"; Stri
子勰
2018/05/22
3.2K0
Web开发须知:URL编码与解码
通常如果一样东西需要编码,说明这样东西并不适合传输。原因多种多样,如Size过大,包含隐私数据,对于Url来说,之所以要进行编码,是因为Url中有些字符会引起歧义。   例如,Url参数字符串中使用k
李海彬
2018/03/27
2.6K0
Web开发须知:URL编码与解码
Python url编码以及反编码
有时候通过浏览器传递过来的数据,经过url编码之后,就无法直接处理了。 需要进行反编码之后才能获取正确的结果。
Devops海洋的渔夫
2019/05/31
2.4K0
HTML网站URL编码和解码学习总结
HTML的URL字符编码概述 描述:URL 编码会将字符转换为可通过因特网传输的格式。
全栈工程师修炼指南
2020/10/23
2.5K1
HTML网站URL编码和解码学习总结
Javascript中的url编码与解码(详解)
摘要 本文主要针对URI编解码的相关问题做了介绍,对url编码中哪些字符需要编码、为什么需要编码做了详细的说明,并对比分析了Javascript中和编解码相关的几对函数escape / unescap
Angel_Kitty
2018/04/17
3K0
url编码和解码分析URLEncoder.encode和URLDecoder.decode
1.Get请求会将参数做默认的url解码操作,接口接收到的值是Get解码后的值。 2.可以将Get操作修改成Post操作,这样不会url解码。可以在接口中做url解码。 3.在多次传递参数的过程中,无需反复的编码(或者加了空格,加了换行),否则会将整个字符串错乱了。 (/ %2F %252F) (+ %2B %252B)
oktokeep
2024/10/09
1950
url编码和解码分析URLEncoder.encode和URLDecoder.decode
SSRF漏洞的URL编码
虽然知道什么是 URL编码 ,之前也学习过 SSRF漏洞 ,但是对 SSRF漏洞 中要进行一次URL编码或者两次URL编码甚是疑惑。 相信很多如我一般初学的小伙伴也有此疑惑。因此,特意学习探讨,于此总结。
cultureSun
2023/07/24
4120
SSRF漏洞的URL编码
PHP字符串的编码问题
大家都知道,不同字符编码,其在内存占用的字节数不一样。如 ASCII编码字符占用1个字节,UTF-8编码的中文字符是3字节,GBK为2个字节。
黄规速
2022/04/14
2.5K0
URL编码
URL 编码的规则:简单来说,如果需要对一个字符进行 URL 编码,首先需要判断该字符是否是 ASCII 字符:
真正的飞鱼
2023/02/04
2.8K0
APP热搜榜接口提供 --- 百度
目的地-Destination
2024/08/07
1490
APP热搜榜接口提供 --- 百度
关于URL编码
一般来说,URL只能使用英文字母、阿拉伯数字和某些标点符号,不能使用其他文字和符号。比如,世界上有英文字母的网址"http://www.abc.com",但是没有希腊字母的网址"http://www.aβγ.com"(读作阿尔法-贝塔-伽玛.com)。这是因为网络标准RFC 1738做了硬性规定:
ruanyf
2018/09/21
1.8K0
关于URL编码
Scrapy笔记三 自动多网页爬取-本wordpress博客所有文章
学习自http://blog.csdn.net/u012150179/article/details/34486677
十四君
2019/11/27
8050
经常要配置生物信息/深度学习电脑环境?一文少花90%看教程的时间
官网下载anaconda3,安装过程选择默认,记得勾选将anaconda放入环境变量。
依芙
2024/09/15
1321
Java 技术篇 - ServerSocket接收http的url请求中包含中文的处理方法,URLDecode与URLEncode,url解码与编码
效果图: 正常接收到中文的请求是这个样子的:%E6%AC%A2%E8%BF%8E%E6%9D%A5%E5%88%B0%E5%B0%8F%E8%93%9D%E6%9E%A3%E7%9A%84%E5%8D%9A%E5%AE%A2%EF%BC%81 通过解码方法: String url_new = java.net.URLDecoder.decode(url, "UTF-8"); 解码后恢复为中文: 欢迎来到小蓝枣的博客!
小蓝枣
2021/12/01
1.3K0
Java 技术篇 - ServerSocket接收http的url请求中包含中文的处理方法,URLDecode与URLEncode,url解码与编码
2018-8-26-各种URL编码傻傻分不清楚
进行web开发时总要遇到URL编码的问题,但是看看.Net提供的库函数真是难以区分。
黄腾霄
2020/06/10
8800
【答案&解析】Java工程师100道考题 | 超过60分的不到10%!
小傅哥,你的100道Java考题,我只考了16分,是不是没救了!给我个答案吧!那么鉴于不少小伙伴已经考完了,那么小傅哥就做一个考题解析,方便读者可以针对自己的问题进行补充学习。
小傅哥
2022/12/13
2.5K0
【答案&解析】Java工程师100道考题 | 超过60分的不到10%!
dk1.8和jdk17底层对url参数的编码不一样吗
当涉及到处理 URL 参数时,JDK 1.8和 JDK 17 在底层的编码方式上有一些差异。在本文中,我们将通过一个具体的案例来说明这些差异,并提供相应的代码示例。
GeekLiHua
2025/01/21
790
Java的URLEncoder.encode("需要编码的参数","UTF-8")
比较JS的encodeURIComponent函数和Java的URLEncoder.encode("需要编码的参数","UTF-8")函数: 对//中国/images/head_tripletown.png//!@#$%^&*()进行URL编码:
用户8983410
2021/10/08
1.4K0
iOS中URL编码那些事
在iOS程序中,访问一些HTTP/HTTPS的资源服务时,如果url中存在中文或者特殊字符时,会导致无法正常的访问到资源或服务,想要解决这个问题,需要对url进行编码。
freesan44
2018/09/05
2.7K0
非对称密钥沉思系列 收官篇:证书格式与编码的部分总结
数字1被ISO加在ASN的后边,是为了保持ASN的开放性,可以让以后功能更加强大的ASN被命名为ASN.2等,但至今也没有出现。
bowenerchen
2023/01/04
3.8K1
推荐阅读
相关推荐
URL编码中的空格(编码以后变为+)
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文