jsp中的中文乱码问题详解

       在jsp页面中,中文乱码问题算是比较常见的问题。没碰到还好,但是让那些对编码转码迷糊的人碰到绝对让其头痛到“以头抢地而”,哈哈,开玩笑的、、、

        首先,来提提与jsp中与编码相关的几个地方:

第一个地方:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>

       这里的编码格式为jsp文件的存储格式。Eclipse会根据这个编码格式保存文件。并编译jsp文件,包括里面的汉字。

第二个地方:

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

       这里的编码为解码格式。第二处所在的这一行,可以没有。缺省时是使用iso8859-1的编码格式。若存为UTF-8的文件被解码为iso8859-1,中文肯定出乱码。也就是必须一致。

第三个地方:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

       这里的编码为控制浏览器的解码方式。如果前面的解码都一致并且无误的话,这个编码格式没有关系。有的网页出现乱码,就是因为浏览器不能确定使用哪种编码格式。因为页面有时候会嵌入页面,导致浏览器混淆了编码格式,出现了乱码。

 

       好了,说完了那三个地方,下面开始说乱码的问题。乱码出现的情况大致有一下几种情况:url中带中文参数,form的提交(包括get、post),解决办法先总结如下:

 

1、接受参数时进行编码转换:我们知道,tomcat的内部编码格式iso8859-1,提交时,如果没有设置提交的编码格式,则会以iso8859-1方式进行提交,接受的jsp却以utf-8的方式接受,导致乱码。

           例如,请求页面的

<a href="page.jsp?p=中文">url中传递中文字符</a>

或者

    <form action="page.jsp" method="post">
    	<input type="text" name="p">
    	<input type="submit" value="提交">
    </form>

           那么,在响应页面都可以这样来接受参数p的值:

String p=new String(request.getParameter("p").getBytes("iso-8859-1"),"utf-8");

 

2、在请求页面对特殊字符参数进行2次编码,然后再响应页面进行1次解码:注意:转码时要转两次,解码需要一次就能够解决中文参数乱码问题,这是因为URL传递参数时服务器会自动解码一次。

          例如,请求页面的

<a href="page.jsp?p=<%=URLEncoder.encode(URLEncoder.encode("中文", "UTF-8"), "UTF-8") %>">点我</a>

        若在js中进行转码,则是:

var post_date=encodeURI(encodeURI(b));  
var action="surveyResult.action?answer="+post_date; 

        那么,在响应页面都可以这样来接受参数p的值(中文):

String p=URLDecoder.decode(request.getParameter("p"), "utf-8");

 

3、修改服务器tomcat默认的编码格式:打开tomcat下的conf文件夹下的service.xml查找8080,在找到的<Connector port="8080" .../>标签内添加URIEncoding="UTF-8"。

        例如:

<Connector port="8080"maxThreads="150" minSpareThreads="25" maxSpareThreads="75"enableLookups="false" redirectPort="8443" acceptCount="100"debug="0" connectionTimeout="20000" useBodyEncodingForURI="true"disableUploadTimeout="true" URIEncoding=”UTF-8”/>       

 

4、使用过滤器对所有jsp进行编码处理:这个网上有很多例子,请大家自己查阅。

       例如:Encoding过滤器

package com.zzw;

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 Encoding implements Filter {
	public void destroy() {
	}

	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		request.setCharacterEncoding("utf-8");
		chain.doFilter(request, response);
	}

	public void init(FilterConfig filterConfig) throws ServletException {
	}
}

然后,Web.xml文件中的设置:

       <filter>
	       <filter-name>encoding</filter-name> 
	       <filter-class>com.zzw.Encoding</filter-class> 
	</filter> 
	<filter-mapping> 
		<filter-name>encoding</filter-name> 
		<url-pattern>/ToCh_zn</url-pattern> 
	</filter-mapping>


*5、在请求页面上开始处,执行请求的编码代码

request.setCharacterEncoding("UTF-8");

把提交内容的字符集设为UTF-8。这样的话,接受此参数的页面就不必在转码了。直接使用

String str = request.getParameter("something");

即可得到汉字参数。但每页都需要执行这句话。这个方法也就对post提交的有效果,对于get提交和上传文件时的enctype="multipart/form-data"是无效的。

(与request对应的response页面,添加

responset.setCharacterEncoding("UTF-8");

)

(此方法打*号,是因为网上有人提出此方法,但是经我测试没有通过。是不是有效,大家可以自己测测!)

 

   


 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值