SAP ABAP URL 编码表 HTTP特殊字符处理

URL编码表

backspace8%A41%a61%§%A7Õ%D5
tab9%B42%b62%«%ABÖ%D6
linefeed%0AC43%c63%¬%ACØ%D8
creturn%0DD44%d64%¯%ADÙ%D9
space20%E45%e65%º%B0Ú%DA
!21%F46%f66%±%B1Û%DB
"22%G47%g67%ª%B2Ü%DC
#23%H48%h68%,%B4Ý%DD
$24%I49%i69%µ%B5Þ%DE
%25%J%4Aj%6A»%BBß%DF
&26%K%4Bk%6B¼%BCà%E0
'27%L%4Cl%6C½%BDá%E1
(28%M%4Dm%6D¿%BFâ%E2
)29%N%4En%6EÀ%C0ã%E3
*%2AO%4Fo%6FÁ%C1ä%E4
+%2BP50%p70%Â%C2å%E5
,%2CQ51%q71%Ã%C3æ%E6
-%2DR52%r72%Ä%C4ç%E7
.%2ES53%s73%Å%C5è%E8
/%2FT54%t74%Æ%C6é%E9
030%U55%u75%Ç%C7ê%EA
131%V56%v76%È%C8ë%EB
232%W57%w77%É%C9ì%EC
333%X58%x78%Ê%CAí%ED
434%Y59%y79%Ë%CBî%EE
535%Z%5Az%7AÌ%CCï%EF
636%ð%F0
737%?%3F{%7BÍ%CDñ%F1
838%@40%|%7CÎ%CEò%F2
939%[%5B}%7DÏ%CFó%F3
:%3A\%5C~%7EÐ%D0ô%F4
;%3B]%5D¢%A2Ñ%D1õ%F5
%3C^%5E£%A3Ò%D2ö%F6
=%3D_%5F¥%A5Ó%D3÷%F7
%3E`60%|%A6Ô%D4ø%F8
ù%F9

为什么要进行URL编码!!!

我们都知道Http协议中参数的传输是"key=value"这种简直对形式的,如果要传多个参数就需要用“&”符号对键值对进行分割。

 

如"?name1=value1&name2=value2",这样在服务端在收到这种字符串的时候,会用“&”分割出每一个参数,然后再用“=”来分割出参数值。

针对“name1=value1&name2=value2”我们来说一下客户端到服务端的概念上解析过程:

上述字符串在计算机中用ASCII吗表示为:

6E616D6531 3D 76616C756531 26 6E616D6532 3D 76616C756532。6E616D6531:name13D:=76616C756531:value126:&6E616D6532:name23D:=76616C756532:value2

服务端在接收到该数据后就可以遍历该字节流,首先一个字节一个字节的吃,当吃到3D这字节后,服务端就知道前面吃得字节表示一个key,再想后吃,如果遇到26,说明从刚才吃的3D到26子节之间的是上一个key的value,以此类推就可以解析出客户端传过来的参数。

现在有这样一个问题,如果我的参数值中就包含=或&这种特殊字符的时候该怎么办?

比如说“name1=value1”,其中value1的值是“va&lu=e1”字符串,那么实际在传输过程中就会变成这样“name1=va&lu=e1”。我们的本意是就只有一个键值对,但是服务端会解析成两个键值对,这样就产生了奇异。

如何解决上述问题带来的歧义呢?解决的办法就是对参数进行URL编码

URL编码只是简单的在特殊字符的各个字节前加上%,例如,我们对上述会产生奇异的字符进行URL编码后结果:“name1=va%26lu%3D”,这样服务端会把紧跟在“%”后的字节当成普通的字节,就是不会把它当成各个参数或键值对的分隔符。

另外一个问题,就是为什么我们要用ASCII传输,可不可以用别的编码?

当然可以用别的编码,你自己可以开发一套编码,然后自己解析。就像大部分国家都有自己的语言一样。那国家之间要交流,怎么办?用英语把,英语的使用范围最广。

通常如果一样东西需要编码,说明这样东西并不适合传输。原因多种多样,如Size过大,包含隐私数据,对于Url来说,之所以要进行编码,是因为Url中有些字符会引起歧义。

例如,Url参数字符串中使用key=value键值对这样的形式来传参,键值对之间以&符号分隔,如/s?q=abc&ie=utf-8。如果你的value字符串中包含了=或者&,那么势必会造成接收Url的服务器解析错误,因此必须将引起歧义的&和=符号进行转义,也就是对其进行编码。

又如,Url的编码格式采用的是ASCII码,而不是Unicode,这也就是说你不能在Url中包含任何非ASCII字符,例如中文。否则如果客户端浏览器和服务端浏览器支持的字符集不同的情况下,中文可能会造成问题。

Url编码的原则就是使用安全的字符(没有特殊用途或者特殊意义的可打印字符)去表示那些不安全的字符。

预备知识:URI是统一资源标识的意思,通常我们所说的URL只是URI的一种。典型URL的格式如下所示。下面提到的URL编码,实际上应该指的是URI编码。

哪些字符需要编码

RFC3986文档规定,Url中只允许包含英文字母(a-zA-Z)、数字(0-9)、-_.~4个特殊字符以及所有保留字符。RFC3986文档对Url的编解码问题做出了详细的建议,指出了哪些字符需要被编码才不会引起Url语义的转变,以及对为什么这些字符需要编码做出了相应的解释。

还有一些字符(!><'()*+,;=)用于在每个组件中起到分隔作用的,如=用于表示查询参数中的键值对,&符号用于分隔查询多个键值对。当组件中的普通数据包含这些特殊字符时,需要对其进行编码。

RFC3986中指定了以下字符为保留字符:! * ' ( ) ; : @ & = + $ , / ? # [ ]

 

需要注意的是,对于Url中的合法字符,编码和不编码是等价的,但是对于上面提到的这些字符,如果不经过编码,那么它们有可能会造成Url语义的不同。因此对于Url而言,只有普通英文字符和数字,特殊字符$-_.+!*'()还有保留字符,才能出现在未经编码的Url之中。其他字符均需要经过编码之后才能出现在Url中。

但是由于历史原因,目前尚存在一些不标准的编码实现。例如对于符号,虽然RFC3986文档规定,对于波浪符号,不需要进行Url编码,但是还是有很多老的网关或者传输代理会进行编码。

如何对Url中的非法字符进行编码

Url编码通常也被称为百分号编码(Url Encoding,also known as percent-encoding),是因为它的编码方式非常简单,使用%百分号加上两位的字符——0123456789ABCDEF——代表一个字节的十六进制形式。

Url编码默认使用的字符集是US-ASCII。例如a在US-ASCII码中对应的字节是0x61,那么Url编码之后得到的就是%61,我们在地址栏上输入http://g.cn/search?q=%61%62%63,实际上就等同于在google上搜索abc了。又如@符号在ASCII字符集中对应的字节为0x40,经过Url编码之后得到的是%40。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值