HTTP协议中的编码问题

HTTP协议中的编码问题

   基于HTTP协议的web网站的建设中,时常会遇到显示乱码的情况。引起乱码现象的原因归根到底就是编码与解码过程的不对称,那么我们就来了解一下HTTP协议的编码规则。

一,URL与UrlEncode
  网络上的资源都可以通过统一资源定位符(URL)访问到,URL是统一资源标识符(URI)的最常见形式,可以精确说明资源的位置以及如何访问资源。URL需要满足一个特性就是它必须是可以移植的,即世界上每一台计算机上的每个浏览器都可以访问到一个发布出去的URL,并且能够成功的定位到相同的资源上。这就需要URL有一套自己的编码机制来传递各个字符集中的字符,并且传输的过程中不能有信息的丢失,最好还要具有可读性。于是,URL编码选定了ASCII编码字符集作为它的字符集,将字节信息转换成百分号“%”加两位16进制的数字表示,这就是UrlEncodeASCII字符集中的字符是世界上最通用的字符,所有的计算机都要支持。经过百分号编码后的URL中的字符都是可见的ASCII字符,在网络上传输或者人工阅读都非常方便。

  但是,UrlEncode是一套独立完整的字符编码方案吗,它可以把任意字符集中的字符直接编码成ASCII形式的字节信息吗?当然不是的,首先UrlEncode的编码对象不是字符本身,而是字符经过其他编码方案转换后的字节信息。所以在进行UrlEncode的时候是需要选择一种编码方案的,我们可以在浏览器中输入中文来查询并不是因为不用选择编码方案,而是采用了系统或浏览器默认的编码。

  一个URL编码过程是这样的,如我要在谷歌中搜索“URL编码”,它的URL大概是这个样子:
https://www.google.com.hk/webhp?q=URL编码。那么,首先需要对特殊字符“编码”做编码转换成字节,“编码”两个字通过UTF-8编码后的字节用16进制表示就是E7BC96E7A081。然后按照刚才说的UrlEncode方法在每个字节前面添加一个百分号,形成最终的地址:https://www.google.com.hk/webhp?q=URL%E7%BC%96%E7%A0%81。

二,UrlEncode的适用范围
   HTTP的报文中可以包含访问的路径、查询参数、Header以及"application/x-www-form-urlencoded" POST类型的数据,这几部分都可能会包含一些特殊字符,那么这几部分也就都需要进行编码,并且都必须使用UrlEncode编码。

三,UrlEncode编码方案的标准
  刚刚说到,字符数据先要根据某种字符编码转换为字节流,然后再表示为可见的URL。如果各个浏览器厂家使用不同的编码方案,并且不加任何提示信息。那么对于服务端来说将是一个灾难,因为他们根本就不知道选择哪种解码方案,如何将字节流还原回原来的字符信息。好在已经有标准规定了UrlEncode中所使用的编码。

  2005年1月发布的RFC 3986,强制所有新的URI必须对未保留字符不加以百分号编码;其它字符要先转换为UTF-8字节序列, 然后对其字节值使用百分号编码。
 
四,普通POST数据的编码
    "application/x-www-form-urlencoded" POST类型的是使用UTF-8和百分号编码,那么POST其他数据是怎样的呢?HTTP协议规定通过"Content-Type"首部来指定发送的数据所使用的编码,如"text/html;charset=UTF-8",这样服务器就知道用UTF-8编码来解码POST的数据了。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值