转自:http://blog.sina.com.cn/s/blog_87cb63e50102w2b6.html

以下为正文:

***************************************************

基本概念

  有信息交换就会产生编码、传输、解码三个过程。编码是信息从一种形式转变成另一种形式的过程,正如人类的语言通过声带编码,转换成声波。解码是编码的逆函数,耳膜接收声波,通过脑神经解码成人类文化所能理解的信息。
  字符集是一种文化上下文下的所有文字符号集合,它的作用是规定了某个文化下的所有字符,以及该字符在信息交换系统下的表示方式,在计算机信息系统下是字节或01序列。本文会在某些时刻将字符集和编码方案互用,以方便理解。
    对于java web应用,狭隘的编码解码的过程可以简单的理解为:编码的过程是文本字符串信息编码成01序列,解码是将01序列恢复为文本字符串信息,具体编码成什么样的01序列是由编码采用的字符集来决定的,也就是编码方案。
    乱码是对信息采用的编码方案无法理解,使用了错误的编码方案对信息进行解码造成的。如果要理解一段信息的真实意图,就得知道信息采用的编码方案,这是信息交换的密钥,这就是为什么战争年代破解对方电报加密方式,实际上就是在破译对方的编码方案。

http协议层的编码解码
    http协议层的字符集关系到http发送者和接送者采用什么字符集方案解析对方发送的内容。

浏览器端的编码
    请求端常规请求方式主要为form、url、ajax、http组件如HttpClient API。
    浏览器存在文档编码方案charset的概念,文档的编码方案等同于文档解码方案,它对文档中发生的请求编码会产生影响。
    影响form提交数据的编码的因素包括:form的accept-charset属性、html文档的编码方案即 document.charset。其中,form的accept-charset是否能够有效,依赖具体浏览器的实现,有些浏览器并不支持,如IE。文 档编码方案可以通过document.charset来修改。
    文档内的url编码,如iframe的src指定的url,以文档编码方案为准,地址栏的url的编码方案完全取决于具体的浏览器实现,通过HttpClient组件发送请求时,url是能任意指定编码方案的。
    ajax发送http请求的url编码方式完全取决于浏览器实现,一般支持以文档编码方案来决定,但是数据体统一采用utf-8,另外,虽然 ajax可以指定header在contenttype说明编码方案,但这种做法不会对url、数据体的编码方案产生任何影响,甚至在有些浏览器中,最终 contenttype中的编码描述都无法真正影响。
    另外,header的编码方案是iso-8859-1,这个是http规范。

服务端的解码
    服务端的httpserver需要解码的对象包括:header、url、数据体。
    header解码方案是iso-8859-1。
    url解码方案通常称为URIEncoding,一般HttpServer会提供相应设置,标准servlet并不提供该接口。jetty默认utf-8字符集来解码,但其他httpserver如tomcat会默认iso-8859-1。
    数据体解码在servlet中可以通过request.setCharacterEncoding来设置。一般的,有些httpserver会以characterEncoding>request请求头字符集>utf-8的优先顺序来决定数据体的解码方案。

服务端的编码
    服务端httpserver需要编码的对象是:header、数据体。
    header的编码方案同样是iso-8859-1。
    通常情况下,服务端必须要指定返回数据体的编码方案且要在header中标注编码方案,否则httpserver一般默认iso-8859-1对输出进行编码,而浏览器也无法得知返回数据体的编码方案,只能自行猜测,完全依赖浏览器自己的实现。
    response.setCharacterEncoding的职能是告诉httpserver数据体的编码方案,并不会也不应该影响到 header中的编码方案的标注。response.setContentType会影响到header的编码方案的标注,浏览器根据该标识决定解码方 案。对于一个健全的httpserver来说,在同时通过两个方法指定了数据体编码方案和header编码方案标注的情况下,数据体编码方案应该由后者决 定,这样使浏览器端得到的编码信息和服务端真正编码信息一致。另外,一定要注意的是这两个指定编码方案的方法必须在response创建输出流之前调用, 输出流一旦创建,编码方案无法后期指定。

浏览器端的解码
    浏览器端对返回进行解码的对象包括:header、数据体。
    header的解码方案是iso-8859-1。
    浏览器的数据体解码方案依赖返回信息,浏览器首先从返回头header中查找编码方案标注,如果没有标注,在得知返回内容为html内容的话,将从head的meta标签中读取,如果还没找到,浏览器就不知道如何解码,会消极的选择一种解码方案。
    在理论上,推荐html文档在meta中声明编码,且编码的声明一定要在文件开始的1024字节内完成,所以最好在head标签开始时立即声明。
    文档中通常都会有一些通过url下载的资源文件,如css和js文件,如果资源文件输出时没有在返回头中指定明确的编码方案,浏览器无法得知编码方案,只能以上面介绍到的文档编码方案来进行解码,这也是浏览器容错的最佳策略。

web应用中浏览器与服务端的编码和解码的更多相关文章

  1. 在ASP.NET Core Web API中为RESTful服务增加对HAL的支持

    HAL(Hypertext Application Language,超文本应用语言)是一种RESTful API的数据格式风格,为RESTful API的设计提供了接口规范,同时也降低了客户端与服务 ...

  2. DelphiXE7中创建WebService(服务端+客户端)

    相关资料: http://www.2ccc.com/news/Html/?1507.html http://www.dfwlt.com/forum.php?mod=viewthread&tid ...

  3. DelphiXE7中创建WebService(服务端+客户端) good

    相关资料:http://www.2ccc.com/news/Html/?1507.html DelphiXE7新建WebService具体操作:1.打开“DelphiXE7”->“File”-& ...

  4. 在python中编写socket服务端模块(二):使用poll或epoll

    在linux上编写socket服务端程序一般可以用select.poll.epoll三种方式,本文主要介绍使用poll和epoll编写socket服务端模块. 使用poll方式的服务器端程序代码: i ...

  5. php开发中怎么获取服务端MAC地址?

    MAC(Media Access Control或者Medium Access Control)地址,意译为媒体访问控制,或称为物理地址.硬件地址,用来定义网络设备的位置.在php中如何获取MAC(M ...

  6. jQuery中的ajax服务端返回方式详细说明

    http://blog.sina.com.cn/s/blog_6f92e3a70100u3b6.html     上次总结了下ajax的所有参数项,其中有一项dataType是设置具体的服务器返回方式 ...

  7. 在vs2005中使用AnkhSvn服务端IP改变无法连接

    1.打开VS2005,选择文件-->Subversion-->Pending Changes 2.在弹出的对话框中 选择other. 荆州古城

  8. 【DDD/CQRS/微服务架构案例】在Ubuntu 14.04.4 LTS中运行WeText项目的服务端

    在<WeText项目:一个基于.NET实现的DDD.CQRS与微服务架构的演示案例>文章中,我介绍了自己用Visual Studio 2015(C# 6.0 with .NET Frame ...

  9. Swift3.0服务端开发(一) 完整示例概述及Perfect环境搭建与配置(服务端+iOS端)

    本篇博客算是一个开头,接下来会持续更新使用Swift3.0开发服务端相关的博客.当然,我们使用目前使用Swift开发服务端较为成熟的框架Perfect来实现.Perfect框架是加拿大一个创业团队开发 ...

随机推荐

  1. PHP性能测试工具xhprof安装与使用

    原文链接:http://www.orlion.ga/711/ 一.安装 wget https://pecl.php.net/get/xhprof-0.9.4.tgz tar zxf xhprof-0. ...

  2. 《Android深度探索HAL与驱动开发》第三章阅读心得

    Git是Linux内核代码对源代码进行管理的软件,他的各方面要优与其他同类的源代码管理软件. 安装Git后,查看Git文档在Linux下可以直接使用man命令看指令的帮助文档.安装git-doc后会安 ...

  3. ViewPager+Fragment实现页面的切换

    新知识,新摘要: 效果图:framgent导入包都是v4包下,谨慎导入错误! 首先设置viewPager布局: <?xml version="1.0" encoding=&q ...

  4. php 审核管理

    权限管理界面 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www. ...

  5. Hadoop生态上几个技术的关系与区别:hive、pig、hbase 关系与区别

    初接触Hadoop技术的朋友肯定会对它体系下寄生的个个开源项目糊涂了,我敢保证Hive,Pig,HBase这些开源技术会把你搞的有些糊涂,不要紧糊涂的不止你一个,如某个菜鸟的帖子的疑问,when to ...

  6. COSBench性能测试配置--一张图说明一切

    COSBench性能测试配置--一张图说明一切: 测试配置,并发数,运行时间设置  

  7. 图解Nosql(hbase)与传统数据库的区别

    图解Nosql(hbase)与传统数据库的区别http://www.aboutyun.com/thread-7804-1-1.html(出处: about云开发) 问题导读:1.nosql数据库能否删 ...

  8. iOS 开发之重力动画效果

    步骤:1.使用single view application创建新的项目 2.在viewcontroller.h文件中创建一个图片实例并与相关图片相连,然后创建一个UIDynamicAnimator ...

  9. CentOS 的网络配置

    1, ifcfg-ethX, 设置对应网口的IP等信息, 比如第一个网口, 那么vim /etc/sysconfig/network-scripts/ifcfg-eth0,配置例子: DEVICE=& ...

  10. Java 7 中 NIO.2 的使用——第一节 Path 类的使用

    路径隶属于文件系统,实际上它是存储和组织媒体文件的格式,通常在一块或多块硬盘设备上,以便于非常容易地检索.文件系统可以通过  java.nio.file.FileSystems 这个final 类来访 ...