一、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. October 2nd 2016 Week 41st Sunday

    The road to success is lined with many tempting parking spaces. 通往成功的路边充斥着许多诱人的休息区. Exhausted, I thi ...

  2. 多线程编程2 - NSOperation

    一.NSOperation 1.简介 NSOperation实例封装了需要执行的操作和执行操作所需的数据,并且能够以并发或非并发的方式执行这个操作. NSOperation本身是抽象基类,因此必须使用 ...

  3. ASCII 非打印字符

    项目出了问题,因为AscII非打印字符的原因,后来找了一下啊ASCII的非打印字符,总共有31个,然后我们直接全部替换成问号了. 解决方式为先找到非打印字符,这是我从网上找的非打印字符表: 进制 十六 ...

  4. hdu1115(计算多边形几何重心)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1115 题意:给出一些点,求这些点围成的多边形的重心: 思路: 方法1:直接分别求所有点的x坐标的平均值 ...

  5. php基础面试题1

    问题1:谈谈你对的PHP的基本认识. 回答:PHP是Hypertext Preprocessor(超文本预处理器)的简称,是一种用来开发动态网站的服务器端脚本语言. 问题2:什么是MVC? 回答:MV ...

  6. JavaScript基础——使用数组

    Array对象提供存储和处理一组其他对象的一种手段.数组可以存储数值.字符串或其他JavaScript对象.创建JavaScript数组有几种不同的方法.例如,下面的语句穿件同样的驻足的3个相同的版本 ...

  7. 与你相遇好幸运,async解决循环回调问题

    由于使用的sailsjs框架,用的是sailsjs自身带的ORm(就是waterline),ORM的默认数据库的返回值在回调里面. > arg是一个数组 count用来计数用 tmpArr临时存 ...

  8. 如何减少JS的全局变量污染

    A,唯一变量 B,闭包

  9. ytu 2558: 游起来吧!超妹!(水题,趣味数学题)

    2558: 游起来吧!超妹! Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 7  Solved: 3[Submit][Status][Web Board ...

  10. js 横幅播放

    js 横幅播放 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www ...