HTTP协议中的编码问题

原创 2015年11月22日 16:07:00

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的数据了。

Http响应和请求的编码问题

1.HttpServletRequest请求中的编码一致     通过Html的表单向服务器提交数据,在Servlet中通过request.getParameter(key)来获得参数值,由于Http...
  • tianmaxingkong_
  • tianmaxingkong_
  • 2015年05月23日 16:58
  • 4195

http request乱码的真相

当然,终极原因http协议里没有规定request一定要指定编码,导致浏览器,web服务器都各搞一套…… 下面一一理清。 首先,从浏览器端看下有多少种情况: 1.在浏览器的地址栏,或者搜索框里输入地址...
  • hengyunabc
  • hengyunabc
  • 2013年12月01日 15:58
  • 22697

http编码

//http编码 - (NSString *)encodeToPercentEscapeString: (NSString *) input{ NSString *outputStr = ...
  • Emperor_huanzi
  • Emperor_huanzi
  • 2016年05月13日 10:38
  • 180

再谈Http协议中消息的编码

HTTP协议报文编码彻底详解。
  • smstong
  • smstong
  • 2010年11月27日 00:18
  • 6472

常见HTTP错误代码大全

一些常见的状态码为:200 - 服务器成功返回网页404 - 请求的网页不存在503 - 服务不可用详细分解:1xx(临时响应)表示临时响应并需要请求者继续执行操作的状态代码。代码 说明100 (继续...
  • xinxin19881112
  • xinxin19881112
  • 2011年06月24日 15:10
  • 49116

httpclient 字符编码问题

在使用HttpClient过程中常见的一些问题。 字符编码 某目标页的编码可能出现在两个地方,第一个地方是服务器返回的http头中,另外一个地方是得到的html/xml页面中。 在http头的C...
  • sebastain
  • sebastain
  • 2013年05月22日 12:11
  • 12876

HttpClient POST 的 UTF-8 编码问题

 Apache HttpClient ( http://jakarta.apache.org/commons/httpclient/ ) 是一个纯 Java 的HTTP 协议的客户端编程工具包, 对 ...
  • wbl313
  • wbl313
  • 2008年04月08日 11:19
  • 8389

Http协议中的编码和解码与浏览器渲染

一、字符集与文字编码简介    1. 计算机如何显示文字   我们知道,计算机是以二进制的“形式”来保存和处理数据的,也 就是说,不管我们使用键盘进行输入,还是让计算机去读取一个文本文件,计算机得到的...
  • J080624
  • J080624
  • 2017年02月19日 17:39
  • 797

说说http协议中的编码和解码

http://www.csdn123.com/html/itweb/20130730/29422_29378_29408.htm **********************************...
  • zhao1949
  • zhao1949
  • 2016年05月31日 10:34
  • 538
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:HTTP协议中的编码问题
举报原因:
原因补充:

(最多只允许输入30个字)