姚竟发,唐小强
保定电力职业技术学院,河北保定 071000
JSP(Java Server Pages)是由Sun公司倡导、许多公司参与一起建立的一种动态网页技术标准,jsp技术采用java作为开发脚本语言,java本身有着很好的跨平台性,但是jsp在结合页面技术后,最使人头疼的一个问题就是不能很好的处理中文乱码问题,在开发过程中带来诸多不便,本文从剖析中文乱码产生的各种原因入手,并给出相应的解决方案。
1)中文的编码很多,在不同的情况下可能有多种不同的二进制值;
2)在某些应用中传递数据时,可能把中文转换成其它形式;
3)在一个应用系统中,编码之间存在各种各样的转换;
4)在转换过程中需要制定编码方式;
5)在具体实践过程中,可能忽略或忘记设置编码;
6)不同的软件环境其编码设置方式不同也容易导致中文乱码;
7)编码工具的多样性以及对编码的模糊认识不清。
网上常出现的 JSP/Servlet encoding 问题一般都表现在 browser或应用程序端,如:
浏览器中看到的 Jsp/Servlet 页面中的汉字怎么都成了‘?’;浏览器中看到的 Servlet 页面中的汉字怎么都成了乱码;JAVA 应用程序界面中的汉字怎么都成了方块;Jsp/Servlet 页面无法显示GBK 汉字;Jsp/Servlet 不能接收 form 提交的汉字;JSP/Servlet 数据库读写无法获得正确的内容。
1)在jsp中如果指定了<%@ page contentType="text/html;charset=A" %>,那么在该jsp中所有用到的数据,如果沒有指定编码,那么这些数据的编码方式为A。
从request得到的数据如果没有指定request的编码的话,默认编码为iso-8859-1。
假设从别的地方得到的数据是使用原来初始的编码的,比如从数据库得到数据,如果数据库的编码是B,那么该数据的编码是B而不是A,也不是系统默认的,此时,如果要输出的数据的编码不是A,那么,很可能显示乱码,所以首先要将数据正确转化为编码A,然后再输出;
2)在jsp中如果没有指定<%@ page contentType="text/html;charset=A" %>,那么默认的A编码为iso-8859-1;
3)Servlet中 如 果 执 行 了 像 response.setContentType("text/html;charset=A"),说明将response的字符输出流编码设置为A,所有要输出的数据的编码要转化为A,否則就会出现乱码。Servlet中从request得到的数据的编码和jsp中一样的,但是在servlet java文件中构造的数据是使用是系统默认的编码(iso-8859-1);servlet中从外部得到的数据使用的是原来的编码,比如从编码为B的数据库得到的数据是编码为B,不是A,也不是系统默认的编码。
<%@ page contentType="text/html; charset=gb2312"%>,就可以消除乱码了。
方法1:在使用request获取参数前,加上此语句:request.setCharacterEncoding("A"), 此处设置的编码要和传递参数的页面采用的编码方式一致。
方法2:使用过滤器(filter),在doFilter方法中做如下处理:
}同时,在web.xml中配置该过滤器:
servlet可以处理中文后,jsp页面接收Form/Request传递的参数却仍然显示为乱码。
如果你的表单内容为