一、JSP 中 pageEndcodeing 和 charset 的作用

<%@ page contentType="text/html;charset=GB2312"%>

  pageEncoding 是 JSP 文件本身的编码

  contentType 的 charset 是指服务器发送给客户端时的内容编码

pageEncoding 和 contentType 的 charset 预设都是 ISO8859-1,JSP 要经过两次的“编码”,第一阶段会用 pageEncoding,第二阶段会用 UTF-8 至 UTF-8,第三阶段就是由 Tomcat出来的网页,用的是 contentType。

  • 第一阶段是 JSP 编译成 .java,它会根据 pageEncoding 设定的编码类型读取 .jsp 文件,由指定的编码方案翻译成统一的 UTF-8 JAVA源码(即.java),如果 pageEncoding设定错了,就会出现中文乱码。
  • 第二阶段是 JAVAC 的编译阶段,不论 JSP 编写时候用的是什么编码方案,经过这个阶段的结果全部是 UTF-8 的 JAVA 源码。JAVAC 用 UTF-8 的 JAVA 源码,编译成UTF-8 的二进制码(即 .class )。
  • 第三阶段是 Tomcat(或其的 Application Container)载入和执行阶段二的来的JAVA二进制码,输出的结果,也就是在客户端见到的,这时参数ContentType 中的 charset 就发挥了功效。

二、JSP 中 pageEncoding 和 charset 的区别

在 JSP/Servlet 中主要有以下几个地方可以设置编 码,pageEncoding="UTF-8"、contentType="text/html;charset=UTF-8"、request.setCharacterEncoding("UTF-8")和 response.setCharacterEncoding("UTF-8"),其中前两个只能用于JSP中,而后两个可以用于JSP和Servlet 中。

  1. pageEncoding="UTF-8" 的作用是设置 JSP 编译成 Servlet 时使用的编码。
    pageEncoding="UTF-8" 的作用就是告诉 JSP 编译器在将 JSP 文件编译成 Servlet 时使用的编码。通常,在 JSP 内部定义的字符串(直接在 JSP 中定义,而不是从浏览器提交的数据)出现乱码时,很多都是由于该参数设置错误引起的。例如,你的 JSP 文件是以 GBK 为编码保存的,而在 JSP 中却指定 pageEncoding="UTF-8",就会引起 JSP 内部定义的字符串为乱码。
    另外,该参数还有一个功能,就是在 JSP 中不指定 contentType 参数,也不使用 response.setCharacterEncoding 方法时,指定对服务器响应进行重新编码的编码。
  2. contentType="text/html;charset=UTF-8" 的作用是指定对服务器响应进行重新编码的编码。
    在不使用 response.setCharacterEncoding() 方法时,用该参数指定对服务器响应进行重新编码的编码。
  3. request.setCharacterEncoding("UTF-8") 的作用是对客户端请求进行重新编码。
    该方法用来指定对浏览器发送来的数据进行重新编码(或者称为解码)时,使用的编码。
  4. response.setCharacterEncoding("UTF-8")的作用是指定对服务器响应进行重新编码的编码。
    服务器在将数据发送到浏览器前,对数据进行重新编码时,使用的就是该编码。同时,浏览器也是根据这个参数来对其接收到的数据进行重新编码(或者称为解码)。所以在无论你在 JSP中设置response.setCharacterEncoding("UTF-8")或者 response.setCharacterEncoding("GBK"),浏览器均能正确显示中文(前提是你发送到浏览器的数据编码是正确的,比如正 确设置了pageEncoding参数等)。

三、浏览器怎样对接受和发送数据进行编码

  1.   默认情况下浏览器在接收服务器数据和发送数据到服务器时所使用的编码是相同的,均为 JSP 页面的 response.setCharacterEncoding 参数(或者 contentType 和 pageEncoding 参数),我们称其为浏览器编码。
      浏览器在发送数据时,对 URL 和参数会进行编码,对参数中的中文,浏览器也是使 response.setCharacterEncoding 参数的编码值来进行 URL 编码的。以百度和 GOOGLE为例,如果你在百度中搜索"汉字",百度会将其编码为"%BA%BA%D7%D6"。而在GOOGLE中搜索"汉字",GOOGLE会将其编 码为"%E6%B1%89%E5%AD%97",这是因为百度的 response.setCharacterEncoding 参数为 GBK,而 GOOGLE 的 response.setCharacterEncoding 参数为 UTF-8。
      当然,在 IE 中可以修改浏览器编码(在IE的菜单中选择"查看(V)"à"编码(D)"中修改),但通常情况下,修改该参数会使原本正确的页面中出现乱码。
      一个有趣的例子是,在 IE 中浏览 GOOGLE 的主页时,将浏览器编码修改为"简体中文 (GB2312)",此时,页面上的中文会变成乱码,不理它,在文本框中输入"汉字",提交,GOOGLE 会将其编码为"%BA%BA%D7%D6",可见,浏览器在对中文进行URL编码时,使用的就是浏览器编码。
      做个实验,在 JSP 中设置 response.setCharacterEncoding("UTF- 8"),在 IE 中显示该页面时,在 IE 的菜单中选择"查看(V)"à"编码(D)"中可以查看到是" Unicode(UTF-8)",而在 JSP中 设置 response.setCharacterEncoding("GBK") ,在 IE 中显示该页面时,在IE的菜单中选择"查看(V)"à"编码(D)"中可以查看到是"简体中文(GB2312)"。
  2.   对于发送数据,服务器按照 response.setCharacterEncoding <— contentType <— pageEncoding的优先顺序,对要发送的数据进行编码。     
      对于接收数据,要分三种情况。一种是浏览器直接用 URL 提交的数据,另外两种是用表单的 GET 和 POST 方式提交的数据。 
      因为各种WEB服务器对这三种方式的处理也不相同,所以我们以 Tomcat5.0 为例。无论使用那种方式提交,如果参数中包含中文,浏览器都会使用当前浏览器编码对其进行URL编码。
    1.   对于表单中 POST 方式提交的数据,只要在接收数据的 JSP 中正确 request.setCharacterEncoding 参数,即将对客户端请求进行重新编码的编码设置成浏览器编码,就可以保证得到的参数编码正确。有写读者可能会问,那如何得到浏览器编码呢?上面我们提过了,在默认请情况下,浏览器编码就是你在响应该请求的JSP 页面中 response.setCharacterEncoding 设置的值。所以对于 POST 表单提交的数据,在获得数据的 JSP 页面中 request.setCharacterEncoding 要和生成提交该表单的JSP页面的 response.setCharacterEncoding 设置成相同的值。
    2.   对于 URL 提交的数据和表单中 GET 方式提交的数据,在接收数据的 JSP 中设置 request.setCharacterEncoding 参数是不行的,因为在 Tomcat5.0 中,默认情况下使用 ISO- 8859-1 对 URL 提交的数据和表单中 GET 方式提交的数据进行重新编码(解码),而不使用该参数对 URL 提交的数据和表单中 GET 方式提交的数据进行 重新编码(解码)。要解决该问题,应该在 Tomcat 的配置文件的 Connecto r标签中设置 useBodyEncodingForURI 或者 URIEncoding 属性,其中 useBodyEncodingForURI 参数表示是否用 request.setCharacterEncoding 参数对 URL 提交的数据和表单中 GET 方式提交的数据进行重新编码,在默认情况下,该参数为 false(Tomcat4.0中该参数默认为 true);URIEncoding 参数指定对所有 GET 方式请求(包括 URL 提交的数据和表单中 GET 方式提交的数据)进行统一的重新编码(解码)的编 码。URIEncoding 和 useBodyEncodingForURI 区别是,URIEncoding 是对所有 GET 方式的请求的数据进行统一的重新编码(解码),而 useBodyEncodingForURI 则是根据响应该请求的页面的 request.setCharacterEncoding 参数对数据进行的重新编码(解码),不同的页面可以有不同的重新编码(解码)的编码。所以对于 URL 提交的数据和表单中 GET 方式提交的数据,可以修改 URIEncoding 参数为浏览器编码或者修改useBodyEncodingForURI 为 true,并且在获得数据的 JSP 页面中 request.setCharacterEncoding 参数设置成浏览器编码。

JSP 中 pageEncoding 和 charset 区别以及中文乱码解决方案的更多相关文章

  1. JSP中pageEncoding和charset区别,中文乱码解决方案(转载)

    转载自:JSP中pageEncoding和charset区别,中文乱码解决方案 JSP指令标签中<%@ page contentType="text/html;charset=GB23 ...

  2. jsp中pageEncoding、charset=UTF -8

    jsp中pageEncoding.charset=UTF -8" 在JSP/Servlet  中主要有以下几个地方可以设置编码,pageEncoding="UTF-8". ...

  3. JSP表单提交中文乱码解决方案

    分2种提交方式,解决方案不同: 1.form表单提交方式为get 乱码: 解决方案: 因为get方法是参数在URL中显示,因为tomcat的URL编码默认是:IOS-8859-1所以要么改tomcat ...

  4. PL/SQL客户端中执行insert语句,插入中文乱码

    问题描述:在PL/SQL客户端中执行insert语句,插入中文乱码 解决方案: 1.执行脚本 select userenv('language') from dual;    结果为AMERICAN_ ...

  5. java 乱码详解_jsp中pageEncoding、charset=UTF -8"、request.setCharacterEncoding("UTF-8")

    http://blog.csdn.net/qinysong/article/details/1179480 java 乱码详解__jsp中pageEncoding.charset=UTF -8&quo ...

  6. (转)JSP HTML JAVASCRIPT 中文乱码 解决方案 大全

    JSP HTML JAVASCRIPT 中文乱码 解决方案 大全 JSP的中文字符一直是各位初学者首先要解决的问题,下面进行了总结,也给出了解决办法.C4.1 HTML中文编码转换 在JSP文件中的静 ...

  7. jsp页面中文乱码解决方案

    一.JSP页面中文乱码 在JSP页面中,中文显示乱码有两种情况:一种是HTML中的中文乱码,另一种是在JSP中动态输出的中文乱码. 先看一个JSP程序: <%@ page language=&q ...

  8. 解决java web中safari浏览器下载后文件中文乱码问题

    解决java web中safari浏览器下载后文件中文乱码问题 String fileName = "测试文件.doc"; String userAgent = request.g ...

  9. Java中文乱码解决方案

    Java中文乱码解决方案   1.中文乱码解决方案,确保每个文件的默认编码是UTF-8         加入 URIEncoding="UTF-8" 代码中的设置 1>在se ...

随机推荐

  1. idea 用maven骨架生成项目速度慢的问题

    使用mvn archetype:generate命令时,加上-DarchetypeCatalog=local archetypeCatalog=local

  2. 2.3顺序容器-deque

    deque(双向队列) 1) *    :包含deque头文件 **  :deque也是一个可变长数组,适用于vector的操作都适用于deque ***:对比vector的优势在于在头部存取元素可以 ...

  3. echarts基本使用

    基本操作: 1,准备好需要渲染chart图的div层 <div id="org-data-percent" class="org-data-percent" ...

  4. 微软MSMQ消息队列的使用

    首先在windows系统中安装MSMQ 一.MSMQ交互 开发基于消息的应用程序从队列开始.MSMQ包含四种队列类型: 外发队列:消息发送到目的地之前,用它来临时存储消息. 公共队列:在主动目录中公布 ...

  5. C# IP地址与整数之间的转换

    IP地址与整数之间的转换 1.IP地址转换为整数 原理:IP地址每段可以看成是8位无符号整数即0-255,把每段拆分成一个二进制形式组合起来,然后把这个二进制数转变成一个无符号的32位整数. 举例:一 ...

  6. Solr入门之(6)配置文件solrconfig.xml

    solrconfig.xml包含了用于配置自身行为的绝大部分参数,其作用范围是当前core.该文件位于${solr_home}/solr/core1/conf/下. 参数列表概览: A.lib B.d ...

  7. oracle检查点队列(checkpoint queue)

    buffer cache CBC链 按地址链 LRU  干净buffer LRUW  脏buffer  按照冷热 checkpoint queue:链buffer,①链脏块②按buffer第一次脏的时 ...

  8. .NET NLog 详解 (三) - LayoutRender

    这期将NLog Git版本指向2005-06-09,NLog v0.9 released.这个时候的代码结构升级为这样: 和上期的版本相比,最明显的莫过于原先的Appender全套更名为Target. ...

  9. Oracle【IT实验室】数据库备份与恢复之四:RMAN(备份与恢复管理器)

    RMAN是ORACLE提供的一个备份与恢复的工具,可以用来备份和还原数据库文件. 归档日志和控制文件.它也可以用来执行完全或不完全的数据库恢复. RMAN可以由命令行接口或者 OEM的 Backup ...

  10. C# NamePipe使用小结

    最近在一次项目中使用到了C#中命名管道,所以在此写下一篇小结备忘. 为什么要使用命名管道呢?为了实现两个程序之间的数据交换.假设下面一个场景.在同一台PC上,程序A与程序B需要进行数据通信,此时我们就 ...