`
guofc201007
  • 浏览: 26964 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

JSP乱码问题

    博客分类:
  • JSP
阅读更多

一.Myeclipse设置新建.jsp文件的默认编码:

Windows---->Preferences---->myeclipse Enterprise Workbench---->File and Editors----->JSP--->把这个目录下的Encoding选为你要设置

 

二.中文乱码的解决方式:

1.设置过滤器

 

package com.hs.guofc.filter;

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 CharacterEncodingFilter implements Filter {

	public void destroy() {
		// TODO Auto-generated method stub
		
	}

	public void doFilter(ServletRequest arg0, ServletResponse arg1,
			FilterChain arg2) throws IOException, ServletException {
		// TODO Auto-generated method stub
		//设置request字符编码
		arg0.setCharacterEncoding("utf-8");
		//传递控制到下一个过滤器
		arg2.doFilter(arg0, arg1);
	}

	public void init(FilterConfig arg0) throws ServletException {
		// TODO Auto-generated method stub
		
	}

}

  <filter>
  	<filter-name>characterEncodingFilter</filter-name>
  	<filter-class>com.hs.guofc.filter.CharacterEncodingFilter</filter-class>
  </filter>
  <filter-mapping>
  	<filter-name>characterEncodingFilter</filter-name>
  	<url-pattern>/*</url-pattern>
  </filter-mapping>

  

 

 

 

三.JSP页面几个编码相关解释(转载)

 <@ page language="java" contentType="text/html; charset=gb2312" 

     pageEncoding="utf-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
servlet text: 中文
</body>
</html>

 

 

其中pageEncoding="utf-8"决定了jsp编译成servlet时所使用的编码,比如“中文”两个字将以utf-8的形式存储。但是如果jsp文本文件本身不是utf-8格式的,那么编译时就已经产生编码不一致的现象,因此无论怎样客户端显示的都是乱码。
  1. pageEncoding="utf-8"contentType="text/html; charset=gb2312"的编码无关,contentType告知浏览器该响应是以那种格式编码的,它是response header的一部分,默认情况下浏览器会直接以这种编码来解析这个来自于服务器端的响应,而不管响应的html是什么内容。响应内容的编码在这时已确定,客户端无法更改,可以变的只能是以何种编码格式去解析。
  2. META属性content="text/html; charset=utf-8"只是一段html字符串,服务器端的响应内容,跟<body>、<script>之类的内容没什么两样,至于浏览器怎么去解读我们不去管它。正常情况下这个meta的charset应该设置为与contentType一致,避免查看客户的源代码时的误读。
  3. 如果服务端使用tomcat,且对URL参数的解析没有做任何特别处理,那么必然会导致中文乱码。因为客户端以Unicode编码传递参数,而tomcat默认使用ISO-8859-1来解析。比如?para=中文将会以?para=%E4%B8%AD%E6%96%87来传递,而tomcat中使用request.getParameter时却将E4转换成byte型,无法逆转。因此必须修改tomcat的配置。在server.xml中加入<Connector port="8080" ... useBodyEncodingForURI="true">,这样就可以通过显式地在jsp中指定编码类型来解析中文参数,如request.setCharacterEncoding("utf-8"),同时也说明这一句在没有修改tomcat配置的情况下是不起作用的。

 

分享到:
评论
1 楼 guofc201007 2011-09-13  
补充一下,如果使用
PrintWriter out = resp.getWriter();
方式来直接回写中文时,需要先进行如下设置:
	resp.setCharacterEncoding("utf-8");
	resp.setContentType("text/html;charset=utf-8");

相关推荐

Global site tag (gtag.js) - Google Analytics