WEB开发常见的中文乱码情况及其解决方案
在使用JSP时,经常会有中文显示乱码的现象,这里对常见的中文乱码的情况及其解决方案做一个汇总。一般出现中文乱码的场合有显示JSP页面,request对象获取请求参数,Servlet输出响应以及与数据库交互等。
一、乱码现象及原因
通常出现中文乱码的现象如下所示:
- 汉字变成了问号“?”
- 有的汉字显示错误,有的则显示正确
- 显示的中文不可读
出现乱码主要是因为字符集编码的问题。
JAVA的内核是Unicode的,也就是说,在程序处理字符时是用Unicode来表示字符的;但同时文件和流的保存方式是使用字节流的。在JAVA的基本数据类型中,char是Unicode的,而byte是字节,因此在不同的环节JAVA要对字节流和char进行转换。
同时JAVA又是根据操作系统的默认编码字符集来决定字符串的初始编码,而且JAVA系统的输入和输出的都是采取操作系统的默认编码。所以当运行JAVA程序时,如果字符集的编码选择不当,就会出现乱码问题。
二、方案列举
在掌握了JAVA系统中文乱码的原因后,就能从根本上解决这个比较麻烦的问题。这里针对上面提到的出现场合,提出相对应的解决方案。
1、在显示JSP页面的时候
在显示JSP页面上解决中文乱码是一个比较简单的技巧,只需要在每一个页面的第一行添加如下代码即可。
<%@ page language="java" contentType="text/html;charset=gb2312"%>
2、在获取请求参数的时候
在通过request对象获取请求的参数及其值时,需要将获取后的参数及其值进行字符串转换,以支持中文显示,具体代码如下所示:
<%
String name=(String) request.getParameter("uid");
String namezh=new String(name.getBytes("iso8859-1"));
%>
除了获取请求外,对于其他JSP内置对象的获取参数,例如config对象获取配置参数,都可以采用如上方式将其转换,在这里不一一列举。
3、Servlet输出响应
用户在编写Servlet时,需要针对不同的请求方法实现不同的处理接口,如处理HTTP GET方法的doGet接口,处理HTTP POST方法的doPost接口等。在实现这些接口时,设置字符集的方法类似,这里只以doGet接口为例,代码如下所示:
public void doGet(HttpServletRequest request,HttpServletResponse)
throws ServletException,I/OException{
request.setCharacterEncoding("gb2312");
request.setContentType("text/html;charset=gb2312");
....
}