pageEncoding与charset的区别及servlet相关中文乱码解决方案

来源:互联网 发布:火炮兰灵族捏脸数据 编辑:程序博客网 时间:2024/03/29 13:13

pageEncoding:是jsp文件本身的编码 

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


在JSP标准的语法中,如果 pageEncoding属性存在,那么JSP页面的字符编码方式就由pageEncoding决定,否则就由contentType属性中的 charset决定,如果charset也不存在,JSP页面的字符编码方式就采用默认的ISO-8859-1


JSP要经过两次的“编码”,第一阶段会用pageEncoding,第二阶段会用utf-8至utf-8,第三阶段就是由Tomcat出来的网页, 用的是contentType。

第一阶:段是jsp编译成.java,它会根据pageEncoding的设定读取jsp,结果是由指定的编码方案翻译成统一的UTF-8 JAVA源码(即.java),如果pageEncoding设定错了,或没有设定,出来的就是中文乱码。

第二阶:段是由JAVAC的JAVA源码至java byteCode的编译,不论JSP编写时候用的是什么编码方案,经过这个阶段的结果全部是UTF-8的encoding的java源码。

第三阶:段java的.class文件执行的过程中向用户端发送html页面的过程中,html的编码格式为charset指定的格式。

contentType的charset是指服务器发送给客户端时的内容编码contentType里的charset=utf-8是指示页面的输出方式为utf-8


举个例子: 

<%@ page contentType="text/html;charset=utf-8" %>

大都会打印出乱码,因为我输入的“你好吗”是gbk的,但是服务器 是否正确抓到“你好吗”不得而知。 

但是如果更改为 

<%@ page contentType="text/html;charset=utf-8" pageEncoding="GBK"%>

这样就服务器 一定会是正确抓到“你好吗”了。

JSP或servlet中中文乱码的解决方案: 

1.以POST请求方式: 

在获取请求参数之前设置: 
request.setCharacterEncoding("utf-8"); 
设置输出编码: 
response.setContentType("text/html;charset=utf-8"); 
或者在jsp页面中设置<%@ page contentType="text/html;charset=utf-8" %>

2.以GET方式请求的 

GET方式请求的设置setCharacterEncoding是无效的。 
我们需要在获取参数后,对每一个参数进行单独转码。 
String name =request.getParameter("name"); 
name=new String(name.getBytes(),"utf-8");

3.在数据库中的乱码: 

设置数据库的编码为utf-8(下面以ORACLE数据库为例)

--查看oracle数据库字符集:

  select userenv('language') from dual;

  查询结果:

  SIMPLIFIED CHINESE_CHINA.AL32UTF8

  --修改oracle数据库字符集:(在SQL Plus中)

  sql> conn / as sysdba;

  sql> shutdown immediate;

  database closed.

  database dismounted.

  oracle instance shut down.

  sql> startup mount;

  oracle instance started.

  total system global area  135337420 bytes

  fixed size                          452044 bytes

  variable size                     109051904 bytes

  database buffers              25165824 bytes

  redo buffers                      667648 bytes

  database mounted.

  sql> alter system enable restricted session;

  system altered.

  sql> alter system set job_queue_processes=0;

  system altered.

  sql> alter system set aq_tm_processes=0;

  system altered.

  sql> alter database open;

  database altered.

  sql> alter database character set internal_use UTF8

  sql> shutdown immediate;

  sql> startup;


4.使用过滤器解决中文乱码问题:

过滤器:

<span style="color:#333333;">package com.util;import java.io.IOException;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;public class SetCharacterEncodingFilter  implements Filter {public void init(FilterConfig filterConfig) throws ServletException {}/** * Select and set (if specified) the character encoding to be used to * interpret request parameters for this request. */public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {</span><span style="color:#ff0000;">request.setCharacterEncoding("utf-8");</span><span style="color:#333333;">// 传递控制到下一个过滤器chain.doFilter(request, response);}public void destroy() {}}</span>

在web.xml中配置

 <!-- 配置编码方式 --><filter><filter-name>SetCharacterEncodingFilter</filter-name><filter-class>com.util.SetCharacterEncodingFilter</filter-class></filter>  <filter-mapping><filter-name>SetCharacterEncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>




Myeclipse中设置默认编码格式:

  jsp本身编码是由编辑器编码格式决定的 ,如果使用的Myeclipse开发则为jsp编辑器默认编码格式(在Myeclipse里面设置jsp的编码方式:window --> Preferences --> MyEclipse --> Files and Editors --> JSP中选择你要设置的Encoding就可以了,一般现在都统一用UTF-8编码了),然后tomcat以pageEncoding编码格式将jsp文件编码为utf-8格式的java源文件(pageEncoding到utf-8),然后JVM将java文件编译为utf-8的class文件(utf-8到utf-8),tomcat再以charset utf-8写到前端(charset ),最后前端显示的编码格式为utf-8 。



0 0
原创粉丝点击