`
wade6
  • 浏览: 274166 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

http请求的编码和解码问题

 
阅读更多

本文在前人整理的基础上进行了二次加工,将一些问题追本溯源。

 

一、字符编码

计算机中的一切计算都是用二进制进行的,具体原因参考后面的链接;

 

早期操作计算机需要学会二进制,操作成本比较大;

 

为了更容易的操作计算机,专家们想将人们容易理解的数字、字母、常用符号等引入计算机,这就需要设置一个固定的二进制来代表这些字符;

 

而具体用哪个二进制表示哪个符号呢,当然每个人都可以约定自己的一套标准,这个标准就叫字符编码。

 

如果大家要想互相通讯而不造成混乱,那么大家就必须使用相同的编码规则;

 

于是最早美国有关的标准化组织就出台了现在的ASCII编码(美国标准信息交换码),统一规定了上述常用符号用哪个二进制数来表示。

 

二、字符编码集

各种符号(文字)与计算机二进制码之间对应关系的映射表

 

三、常见字符集编码

常见的字符编码有ASCII、GB2312、GBK、Unicode、UTF-8等。

 

四、浏览器对请求的编码

一般来说,URL只能使用英文字母、阿拉伯数字和某些标点符号(ASCII码范围),不能使用其他文字和符号。

 

但是URL 常常会包含 ASCII 码范围之外的字符,所以URL 必须转换为有效的 ASCII 格式才能正确使用。

 

URL使用"%"其后跟随两位的十六进制数来替换非 ASCII 字符。URL 不能包含空格,URL 编码通常使用 + 来替换空格。

 

但是这个跟在%后面的十六进制数是多少,是由编码时使用的编码方式决定的。

 

例如:

 

url:www.baidu.com/s?wd=春节;

 

因为URL中有汉字,所以“春节”这两个中文在转换后才能作为正确的URL使用;

 

但是在不同的字符集中,这两个字的编码不同,例如:

  • “春”和“节”的utf-8编码分别是“E6 98 A5”和“E8 8A 82”,那么应该编码成www.baidu.com/s?wd=%E6%98%A5%E8%8A%82;
  • “春”和“节”的GB2312编码分别是“B4 BA”和“BD DA”,那么应该编码成www.baidu.com/s?wd=%B4%BA%BD%DA;

问题是,RFC1738(规定URL格式的标准)没有规定这种情况的具体的编码方法,而是交给应用程序(浏览器)自己决定。

 

这导致不同浏览器的“URL编码”成为了一个混乱的领域,下面来看一下。

 

注意,下面讨论的编码对象是ASCII码范围以外的字符。ASCII码范围的字符不需要编码。

 

1、地址栏中的Get请求的url

  • 在中文环境中,IE默认对URL的Path部分会采用UTF-8来进行编码,参数部分采用GBK来编码;
  • FireFox对URL的Path和参数都采用GBK进行编码。

2、页面中链接的Get请求url

  • 在中文环境中,IE对URL的Path部分都会采用UTF-8来进行编码,而参数部分会根据当前页面的编码确定;
  • FireFox对URL的Path和参数都会采用当前页面的字符集来进行编码。

3、浏览器做普通Post提交url

  • 采用当前页面的字符集进行编码(浏览器大多数时候会根据Http返回头中的Content-Type来确定当前页面的字符集,如果我们想要设定表单提交时所用的字符集编码方式,可以用设定Http返回头中Content-Type的值来实现)。

4、浏览器做Ajax Get提交url

  • 根据浏览器的不同,编码时采用的字符集也是不同的;
  • FireFox始终采用UTF-8;
  • IE会根据本地浏览器的字符集配置来确定采用的字符集。

5、浏览器做Ajax Post提交url

  • 始终会采用UTF-8进行字符集编码(它决定于XMLHttpRequest的实现)。

6、总结

由于不同浏览器对get请求的编码方式不同,所以web应用的访问路径及get请求的参数(直接在url中输入的情况下)基本都使用数字和字母表示,很少用中文等其他ASCII码范围之外的字符,以免出现乱码问题。

 

如果是返回页面中的get请求,服务端肯定会根据自己的情况进行合适的编码,无需关心中文等问题。

 

 

五、web容器对请求的解码

web服务器接收到客户端的请求后,会将其内容转给web容器来处理;

 

因为接到的请求path(url)是编码过的二进制流,所以在处理前会将其转换成ASCII码(应该是由web容器转换,这个不清楚,谁转都一样);

 

但是请求中可能还有部分参数和消息体的数据是经过编码的(例如中文字符被编码),这里就涉及到对请求内容和参数进行解码的问题。

 

1、解码对象

根据对HTTP协议,GET请求只有头信息,POST请求包括头信息和消息体;

 

这里将解码的对象分为两个:头参数和消息体。

 

2、容器的默认解码字符集

对于这两个部分,大多数容器都默认以ISO-8859-1方式进行解码。

 

3、自定义解码字符集

如果不想使用默认的字符集进行解码,web容器允许自定义解码的字符集;

 

1)头参数解码设定

 

以servlet容器为例,通过修改连接器配置来设定头参数的解码方式;

 

修改tomcat的server.xml文件,增加下面的属性就可以设置头参数的解码方式;

 

以下是Tomcat连接器中两个相关配置项的定义(Server.xml中的Connector配置项 http://tomcat.apache.org/tomcat-6.0-doc/config/http.html)


 

2)消息体的解码设定

 

在获取消息体参数前,可以通过调用request.setCharacterEncoding(charset)来设置消息体的解码字符集。


具体情况可参见Servlet学习整理(四)—— ServletRequest和ServletResponse的“请求数据的编码”

 

参考:

http://blog.sina.com.cn/s/blog_70313b0501015ae6.html  计算机为什么只识别二进制

http://ansjsun.iteye.com/blog/1477598   字符编码发展史

http://blog.sina.com.cn/s/blog_812fb97901011e13.html  在Servlet技术中设置客户端和服务器端编码的问题

  • 大小: 60.4 KB
分享到:
评论

相关推荐

    get请求编码解码过程

    get请求编码解码过程

    C++URL编码和解码

    总的来说,C++中处理URL编码和解码需要理解HTTP协议和相关标准,掌握基本的字符串操作技巧,以及可能涉及的字符集问题。通过自定义实现或利用现有库,我们可以方便地在C++程序中实现URL的编码和解码功能。

    java使用URLDecoder和URLEncoder对中文字符进行编码和解码

    在Java编程语言中,`URLDecoder`和`URLEncoder`是两个非常重要的工具类,主要用于处理URL中的中文字符和其他特殊...理解它们的工作原理和使用方法,能帮助开发者避免编码解码过程中的常见问题,保证数据传输的准确性。

    SNMP编码器解码器SNMP编码解码器

    理解和掌握SNMP编码解码器的工作原理和技术细节,对于网络运维和系统管理员来说是非常重要的。在实际操作中,我们可以使用各种开源库和工具来实现SNMP编码解码功能,比如Python的pysnmp库,或者其他编程语言的相应库...

    base64-编码解码工具-python实现源码

    在提供的压缩包文件"base64"中,可能包含了更具体的Base64编码解码工具的实现,例如自定义类或扩展功能。这些源码可以作为学习和理解Base64编码工作原理的实例,也可以作为基础,帮助你开发更复杂的应用,如文件的...

    UrlEncodeDecode解码编码工具(双向)

    总的来说,"UrlEncodeDecode解码编码工具"是一个实用的辅助工具,对于那些经常处理URL编码和解码问题的人来说,它能极大地提高工作效率,简化工作流程。无论你是开发人员、网页设计师,还是需要处理URL的任何人,这...

    对chunked编码进行解码

    一个对chunked编码进行解码的例子,通过java socket实现发送http请求,对gzip压缩的消息体进行解码处理。

    FEC 编码和解码的程序

    总结来说,FEC编码是通过在数据中插入冗余信息来提高数据传输的鲁棒性,其核心是选择合适的编码算法和解码策略。"FEC Code&Decode"程序为我们提供了研究和实践这一技术的平台,对于理解和应用FEC编码技术具有重要的...

    C# Http 编码解码示例代码

    总之,理解HTTP编码解码机制和C#中的相关方法对于开发涉及网络通信的应用程序至关重要。通过有效的编码和解码,开发者可以确保数据在网络间传输时的准确性和完整性,同时处理多语言环境下的字符编码问题。

    URL编码解码免费小工具

    由于URL可能包含各种字符,如空格、特殊字符等,而这些字符在HTTP请求中可能会引起解析问题,因此需要进行编码。URL编码是按照特定规则将URL中的特殊字符转换为可安全传输的形式。 在URL编码中,非字母数字字符通常...

    URL编码解码小程序

    标题中的“URL编码解码小程序”指的是一个工具或软件,其主要功能是处理URL(统一资源定位符)中的编码问题。URL编码是互联网通信中的一种标准化机制,它确保非ASCII字符或特殊字符在URL中能被正确传输和解析。这是...

    url编码和解码的jar的源文件

    总的来说,"commons-codec-1.4-src.tar"压缩包提供的源代码对于Java开发者来说是一个宝贵的资源,特别是那些需要处理URL编码和解码问题的开发者。通过学习和研究这些源代码,我们可以更深入地理解URL编码的机制,...

    Base64 编码和解码

    - API数据交换:在HTTP请求的Body中,Base64编码可以用于传递二进制数据。 总结来说,Base64编码和解码是JavaScript中处理二进制数据的一种常见方法,尤其在数据传输和存储中起着关键作用。通过理解和正确使用这些...

    URL编码解码器

    URL编码(URL Encoding)是互联网应用中常见的数据处理方式,主要目的是为了确保非ASCII字符或者特殊字符在HTTP请求中能够正确...通过"URL编码解码器"这样的工具,开发者可以更方便地处理这些细节问题,提高工作效率。

    C# Base64编码和解码 带源码.rar

    - **HTTP传输**:在HTTP请求中,Base64编码常用于传输图片数据或其他非ASCII的资源。 - **XML或JSON数据**:在网络服务中,Base64编码用于在XML或JSON中安全地传输二进制数据。 - **存储敏感信息**:例如,数据库中...

    Hex 编码/解码工具下载

    在IT领域,Hex编码与解码是数据处理和通信中常见的技术。Hex编码,也称为十六进制编码,是将二进制数据转换为人类可读的十六进制表示方式。这种编码方法常用于计算机科学、网络通信和编程语言中,因为十六进制可以...

    url编码解码源代码

    本话题将详细探讨“url编码解码源代码”,以及如何在CGI(Common Gateway Interface)环境中处理这些编码。 首先,让我们理解URL编码的基本原理。在URL中,某些字符具有特殊含义,如空格通常代表路径分隔,而问号...

    URL编码解码小工具

    URL编码,全称为统一资源定位符(Uniform Resource Locator, URL)编码,是互联网上用于标识资源的...在日常的互联网使用中,掌握URL编码解码的基本原理和使用这样的工具,对于理解和解决网络问题具有重要的实际意义。

    Base64码的编码与解码

    在实际应用中,除了标准的Base64编码外,还有变种如URL安全的Base64编码,它将"+"和"/"替换为"-”和"_",避免在URL中引起问题。另外,还有一些加密库可能会使用Base64编码来表示密文,因为密文通常是二进制格式。 ...

    Android.Base64对图片进行编码和解码

    - **网络传输**:Base64编码后的图片可以直接嵌入HTTP请求,无需额外的文件上传操作。 - **存储**:将图片编码为Base64字符串后,可以存入数据库或写入文件,简化了数据处理流程。 - **配置文件**:在XML或JSON配置...

Global site tag (gtag.js) - Google Analytics