jsp中文编码乱码的分析与解决

2011-08-29 05:39姚竟发唐小强
科技传播 2011年24期
关键词:乱码编码方式字节

姚竟发,唐小强

保定电力职业技术学院,河北保定 071000

0 引言

JSP(Java Server Pages)是由Sun公司倡导、许多公司参与一起建立的一种动态网页技术标准,jsp技术采用java作为开发脚本语言,java本身有着很好的跨平台性,但是jsp在结合页面技术后,最使人头疼的一个问题就是不能很好的处理中文乱码问题,在开发过程中带来诸多不便,本文从剖析中文乱码产生的各种原因入手,并给出相应的解决方案。

1 中文乱码的根源

1)中文的编码很多,在不同的情况下可能有多种不同的二进制值;

2)在某些应用中传递数据时,可能把中文转换成其它形式;

3)在一个应用系统中,编码之间存在各种各样的转换;

4)在转换过程中需要制定编码方式;

5)在具体实践过程中,可能忽略或忘记设置编码;

6)不同的软件环境其编码设置方式不同也容易导致中文乱码;

7)编码工具的多样性以及对编码的模糊认识不清。

2 常见的jsp页面中文乱码

网上常出现的 JSP/Servlet encoding 问题一般都表现在 browser或应用程序端,如:

浏览器中看到的 Jsp/Servlet 页面中的汉字怎么都成了‘?’;浏览器中看到的 Servlet 页面中的汉字怎么都成了乱码;JAVA 应用程序界面中的汉字怎么都成了方块;Jsp/Servlet 页面无法显示GBK 汉字;Jsp/Servlet 不能接收 form 提交的汉字;JSP/Servlet 数据库读写无法获得正确的内容。

3 中文乱码产生原因分析

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,也不是系统默认的编码。

4 中文乱码解决方案

4.1 JSP页面显示为乱码

<%@ page contentType="text/html; charset=gb2312"%>,就可以消除乱码了。

4.2 Servlet接收Form/Request传递的参数时显示为乱码

方法1:在使用request获取参数前,加上此语句:request.setCharacterEncoding("A"), 此处设置的编码要和传递参数的页面采用的编码方式一致。

方法2:使用过滤器(filter),在doFilter方法中做如下处理:

}同时,在web.xml中配置该过滤器:

4.3 JSP接收Form/Request传递的参数时显示为乱码

servlet可以处理中文后,jsp页面接收Form/Request传递的参数却仍然显示为乱码。

如果你的表单内容为

,也就是说没有指定form的method属性。而问题就发生在此,Form的默认mothod属性为get. 而get是通过在发送请求的url后面加?然后加参数和值来传递数据的的,编码格式为ASCII.这就要求我们在传递的数据中有非ASCII字符或是超过了100个字符,那么你必须使用method="post",否则就会出现乱码。所以解决方式为:第二种乱码的解决方式+在发送页面的Form中指定method为post。

4.4 数据库中的中文出现乱码

只要涉及中文的地方全部是乱码,解决办法:在数据库的数据库URL中加上useUnicode=true&characterEncoding=gb2312就OK了。

4.5 客户端读取数据库中文乱码

通过数据库客户端(比如 ODBC 或 JDBC)从数据库服务器中读取字符串时,客户端需要从服务器获知所使用的编码。当数据库服务器发送字节流给客户端时,客户端负责将字节流按照正确的编码转化成 UNICODE字符串。如果从数据库读取字符串时得到乱码,而数据库中存放的数据又是正确的。解决的办法还是通过string = newString(string.getBytes("iso-8859-1"), "GB2312") 的方法,重新得到原始的字节串,再重新使用正确的编码转化成字符串。

4.6 页面在编辑工具中打开时中文乱码

在编辑工具中打开一个已经存在的项目,页面开始的编码如果是gb2312,而打开该页面的工具默认的编码如果是iso8859-1(例如myeclipse和dreamweaver),这时可能产生乱码,直接修改编辑工具的编码方式与原来页面编码一致即可。

5 结论

上面提到的方法应该能解决大部分乱码问题,如果在其他地方还出现乱码,可能需要手动修改代码。解决Java乱码问题的关键在于在字节与字符的转换过程中,你必须知道原来字节或转换后的字节的编码方式,转换时采用的编码必须与这个编码方式保持一致。

[1]刘政.JSP数据库Tomcat产生乱码解决方案总结及原因(转一).新浪博客,1994.

[2]孙鑫.servlet/jsp深入详解.电子工业出版社,2008.

猜你喜欢
乱码编码方式字节
No.8 字节跳动将推出独立出口电商APP
这些真的不是乱码,是汉字
No.10 “字节跳动手机”要来了?
简谈MC7字节码
混合编码方式自适应差分进化算法优化设计宽带天线
炫迈:用神奇乱码勾引你视线
浅谈计算机网络通信中实时差错控制技术
如何解决Tomcat的乱码