JSP 中 pageEncoding 和 charset 区别以及中文乱码解决方案
一、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 中。
- pageEncoding="UTF-8" 的作用是设置 JSP 编译成 Servlet 时使用的编码。
pageEncoding="UTF-8" 的作用就是告诉 JSP 编译器在将 JSP 文件编译成 Servlet 时使用的编码。通常,在 JSP 内部定义的字符串(直接在 JSP 中定义,而不是从浏览器提交的数据)出现乱码时,很多都是由于该参数设置错误引起的。例如,你的 JSP 文件是以 GBK 为编码保存的,而在 JSP 中却指定 pageEncoding="UTF-8",就会引起 JSP 内部定义的字符串为乱码。
另外,该参数还有一个功能,就是在 JSP 中不指定 contentType 参数,也不使用 response.setCharacterEncoding 方法时,指定对服务器响应进行重新编码的编码。 - contentType="text/html;charset=UTF-8" 的作用是指定对服务器响应进行重新编码的编码。
在不使用 response.setCharacterEncoding() 方法时,用该参数指定对服务器响应进行重新编码的编码。 - request.setCharacterEncoding("UTF-8") 的作用是对客户端请求进行重新编码。
该方法用来指定对浏览器发送来的数据进行重新编码(或者称为解码)时,使用的编码。 - response.setCharacterEncoding("UTF-8")的作用是指定对服务器响应进行重新编码的编码。
服务器在将数据发送到浏览器前,对数据进行重新编码时,使用的就是该编码。同时,浏览器也是根据这个参数来对其接收到的数据进行重新编码(或者称为解码)。所以在无论你在 JSP中设置response.setCharacterEncoding("UTF-8")或者 response.setCharacterEncoding("GBK"),浏览器均能正确显示中文(前提是你发送到浏览器的数据编码是正确的,比如正 确设置了pageEncoding参数等)。
三、浏览器怎样对接受和发送数据进行编码
- 默认情况下浏览器在接收服务器数据和发送数据到服务器时所使用的编码是相同的,均为 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)"。 - 对于发送数据,服务器按照 response.setCharacterEncoding <— contentType <— pageEncoding的优先顺序,对要发送的数据进行编码。
对于接收数据,要分三种情况。一种是浏览器直接用 URL 提交的数据,另外两种是用表单的 GET 和 POST 方式提交的数据。
因为各种WEB服务器对这三种方式的处理也不相同,所以我们以 Tomcat5.0 为例。无论使用那种方式提交,如果参数中包含中文,浏览器都会使用当前浏览器编码对其进行URL编码。- 对于表单中 POST 方式提交的数据,只要在接收数据的 JSP 中正确 request.setCharacterEncoding 参数,即将对客户端请求进行重新编码的编码设置成浏览器编码,就可以保证得到的参数编码正确。有写读者可能会问,那如何得到浏览器编码呢?上面我们提过了,在默认请情况下,浏览器编码就是你在响应该请求的JSP 页面中 response.setCharacterEncoding 设置的值。所以对于 POST 表单提交的数据,在获得数据的 JSP 页面中 request.setCharacterEncoding 要和生成提交该表单的JSP页面的 response.setCharacterEncoding 设置成相同的值。
- 对于 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 区别以及中文乱码解决方案的更多相关文章
- JSP中pageEncoding和charset区别,中文乱码解决方案(转载)
转载自:JSP中pageEncoding和charset区别,中文乱码解决方案 JSP指令标签中<%@ page contentType="text/html;charset=GB23 ...
- jsp中pageEncoding、charset=UTF -8
jsp中pageEncoding.charset=UTF -8" 在JSP/Servlet 中主要有以下几个地方可以设置编码,pageEncoding="UTF-8". ...
- JSP表单提交中文乱码解决方案
分2种提交方式,解决方案不同: 1.form表单提交方式为get 乱码: 解决方案: 因为get方法是参数在URL中显示,因为tomcat的URL编码默认是:IOS-8859-1所以要么改tomcat ...
- PL/SQL客户端中执行insert语句,插入中文乱码
问题描述:在PL/SQL客户端中执行insert语句,插入中文乱码 解决方案: 1.执行脚本 select userenv('language') from dual; 结果为AMERICAN_ ...
- 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 ...
- (转)JSP HTML JAVASCRIPT 中文乱码 解决方案 大全
JSP HTML JAVASCRIPT 中文乱码 解决方案 大全 JSP的中文字符一直是各位初学者首先要解决的问题,下面进行了总结,也给出了解决办法.C4.1 HTML中文编码转换 在JSP文件中的静 ...
- jsp页面中文乱码解决方案
一.JSP页面中文乱码 在JSP页面中,中文显示乱码有两种情况:一种是HTML中的中文乱码,另一种是在JSP中动态输出的中文乱码. 先看一个JSP程序: <%@ page language=&q ...
- 解决java web中safari浏览器下载后文件中文乱码问题
解决java web中safari浏览器下载后文件中文乱码问题 String fileName = "测试文件.doc"; String userAgent = request.g ...
- Java中文乱码解决方案
Java中文乱码解决方案 1.中文乱码解决方案,确保每个文件的默认编码是UTF-8 加入 URIEncoding="UTF-8" 代码中的设置 1>在se ...
随机推荐
- 容器配置jndi Tomcat为例
context.xml 文件 <Resource name=" password="spsj" type="javax.sql.DataSource&qu ...
- Java使用正则表达式解析LRC歌词文件
LRC歌词是一种应用广泛的歌词文件,各主流播放器都支持. lrc歌词文本中含有两类标签: 1.标识标签(ID-tags) [ar:艺人名] [ti:曲名] [al:专辑名] [by:编者(指编辑LRC ...
- 素数环(dfs+回溯)
题目描述: 输入正整数n,把整数1,2...n组成一个环,使得相邻两个数和为素数.输出时从整数1开始逆时针排列并且不能重复: 例样输入: 6 例样输出: 1 4 3 2 5 6 1 6 5 2 3 4 ...
- python简介
python起源 作者Guido van Rossum,荷兰人 在创建python之初,1989年12月份,Guido只是想用编程来打发圣诞的闲暇时光.Guido也希望能有一门语言既能够像C语言那样, ...
- python中的monkey-patching
这个技巧我很少用过. 但知道无防. 在运行时改变函数或类的行为, 一般用猴子补丁,原类,装饰器都可以实现. #!/usr/bin/env python # -*- coding: utf-8 -*- ...
- Analysis Services OLAP 概述
1. 什么是OLAP •定义1 :OLAP(联机分析处理)是针对特定问题的联机数据访问和分析.通过对信息(维数据)的多种可能的观察形式进行快速.稳定一致和交互性的存取,允许管理决策人员对数据进行深入观 ...
- cmder
添加cmder到右键菜单 Cmder.exe /REGISTER ALL 打开配置快捷键 win+alt+p 文字重叠 main->font->去掉monospace的勾 λ符号修改 找到 ...
- WPF PRISM开发入门一( 初始化PRISM WPF程序)
这篇博客将介绍在WPF项目中引入PRISM框架进行开发的一些基础知识.目前最新的PRISM的版本是Prism 6.1.0,可以在Github上获取PRISM的源码.这个系列的博客将选择PRISM 4. ...
- SQL常见错误及处理方法
1.情况:数据库引擎安装失败,报类似权限不足的错误 解决:可能由于计算机名和用户名相同导致,更改计算机名,卸载干净重装即可
- Java后端WebSocket的Tomcat实现
转自:http://blog.chenzuhuang.com/archive/28.html 文章摘要随着互联网的发展,传统的HTTP协议已经很难满足Web应用日益复杂的需求了.近年来,随着HTML5 ...