url不需要编码的字符(URL里的乱码到底是个啥)

今天写代码要发起一个HTTP GET请求,WebService接口我们随处可见,作为一个“业务程序员”我们也每天都在写。。。所以指尖跳动,分分钟就出现了下面的代码:

try{ encode=URLEncoder.encode(JsonUtil.convertObject2Json(reqParamsMap),"UTF-8").replace("\\ "," "); }catch(UnsupportedEncodingExceptione) { logger.error("URLEncoder.encodec出错:",e); }

撸完码我回头看了一眼,我习以为常的URL编码,到底是为什么呢?我想大概是怕传输数据中的特殊字符造成什么不可预知的问题吧。

工作完成,测试没有问题。我今天打算打破砂锅问到底,让我们一探究竟,到底为什么要编码?

知道了How,我们还要知道Why!!!

找资料

打开bing,国际搜索(梯子断了很久了……)在stackoverflow上看到也有很多人提出了这个问题,很多的人回答都指向了一个RFC

RFC(Request For Comments)-意即“请求评议”,包含了关于Internet的几乎所有重要的文字资料。 通常,当某家机构或团体开发出了一套标准或提出对某种标准的设想, 想要征询外界的意见时,就会在Internet上发放一份RFC, 对这一问题感兴趣的人可以阅读该RFC并提出自己的意见; 绝大部分网络标准的指定都是以RFC的形式开始,经过大量的论证和修改过程, 由主要的标准化组织所指定的,但在RFC中所收录的文件并不都是正在使用或为大家所公认的, 也有很大一部分只在某个局部领域被使用或并没有被采用, 一份RFC具体处于什么状态都在文件中作了明确的标识.

RFC1738

url不需要编码的字符(URL里的乱码到底是个啥)(1)

可以看到这个RFC是小LEE提出来的,哈哈。里面规定了很多东西,比如url的格式、编码、字符,还有很多scheme,我没看全,看到了FTP和HTTP。

总结一波

URL(统一资源定位符)是万维网中资源的地址。URL具有明确定义的结构,该结构由万维网的发明者Tim Berners-Lee在RFC 1738中提出。

每个网址都采用通用语法,如下所示:

scheme:[//[user:password@]host[:port]]path[?query][#fragment]

[user:password@]由于安全原因,不建议使用URL语法的某些部分,因此很少使用。以下是您在互联网上经常看到的URL的示例-

https://www.google.com/search?q=hello world#brs

对定义统一资源定位符(URL)语法的初始RFC进行了许多改进。当前定义通用URI语法的RFC是RFC 3986。这篇文章包含最新RFC文档中的信息。

URL由属于US-ASCII字符集的有限字符集组成。这些字符包括数字(0-9),字母(AZ,az),以及一些特殊字符("-",".","_","~")。

ASCII控制字符(例如退格,垂直制表符,水平制表,换行等),不安全的字符像space,\,<,>,{,}等等,以及ASCII字符以外的任何字符被不允许直接的URL内放置。

此外,URL中有些字符具有特殊含义。这些字符称为保留字符。的保留字符的一些例子是?,/,#,:等作为URL的一部分发送,无论是在查询字符串或路径段,必须不包含这些字符的任何数据。

那么,当我们需要在URL中传输包含这些不允许的字符的任何数据时,我们该怎么办?好吧,我们对它们进行编码!

URL编码将URL中保留的,不安全的和非ASCII字符转换为所有Web浏览器和服务器普遍接受并理解的格式。它首先将字符转换为一个或多个字节。然后,每个字节由两个十六进制数字表示,后跟一个百分号(%)-(例如%xy)。百分号用作转义字符。

URL编码也称为百分比编码,因为它使用百分号(%)作为转义字符。

URL编码示例

空格:您可能会遇到的最常见的URL编码字符是space。space十进制字符的ASCII码为32,转换为十六进制时为20。现在,我们在十六进制表示形式之前加一个百分号(%),这使我们获得了URL编码值- 。

: 看到我一开始代码里的replace,那是因为:

url不需要编码的字符(URL里的乱码到底是个啥)(2)

w3c的规定是空格被替换为 ,Java中的URLEncoder正是这种情况,会把空格转成

url不需要编码的字符(URL里的乱码到底是个啥)(3)

这就会导致在一些遵循RFC的应用上无法解码或其他问题,所以我们取一个折中的方法,要在URLEncoder.encode()之后把 替换为

ASCII字符编码参考

下表是ASCII字符对其相应的URL编码形式的引用。

请注意,不需要编码字母数字ASCII字符。例如,您不需要编码字符'0'以0如图所示下表。可以原样发送。但是根据RFC编码仍然有效。表格中所有可以安全地在URL中传输的字符都显示为绿色。

下表使用RFC 3986中定义的URL编码规则。

表格粘不过来。。。头条这个编辑器有毒吧。想了解的可以自行搜索下,也可以联系我哦!!!

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页