一、出现中文的原因
Java程序中出现中文乱码的根源在于当Java程序与其他存储媒介交互时,因采用的字符编码方案不支持中文而导致的乱码。
很多存储媒介(数据库、文件等)的存储方式都是基于字节流的,Java应用程序与这些媒介交互时就会发生字符(char)与字节(byte)之间的转换。具体情况如下:
- 从JSP页面表单提交数据到Servlet时,字节转换为字符。
- 从Servlet到数据库存储时,字符转换为字节。
- 从数据库到Servlet读取时,字节转换为字符。
- 从Servlet到JSP页面显示时,字符转换为字节。
- 当Java程序读取文件内容时,字节转换为字符。
- 当Java程序向文件存储数据时,字符转换为字节。
总结:数据输出时,字符转换为字节;数据读取时,字节转换为字符。
如果以上转换过程中,任意一个使用的编码方式与字节原有的编码方式不一致,就会出现中文乱码的现象。支持中文字符的字符集有“UTF-8”、“GBK”、“GB2312”和“GB18030”等,其中“UTF-8”通用性最强。
二、乱码解决方案
1、JSP页面乱码问题
导致这种乱码的原因时没有在JSP页面里指定使用的字符集编码,只要将JSP页面page指令的contentType属性和pageEncodeing属性,以及HTML的META标签的charset属性指定使用支持中文字符的字符集编码即可。
需要注意的是,在指定字符集的时候,字符集的名称是不区分大小写的,例如UTF-8和utf-8是一样的。另外,也要确保浏览器对文件的编码方式的设置。
2、表单提交中文参数时出现乱码的问题
JSP获取页面参数时,一般采用系统默认的编码方式(即ISO8859-1),如果页面参数的编码类型和系统默认的编码类型不一致时就会出现乱码问题,
第一种方式是获取页面提交方式为“POST”的数据时,可以使用request对象的setCharacterEncoding()方法强制设定获取表单数据的编码方式。
//设定POST提交方式的报文的字符编码为UTF-8
request.setCharacterEncoding("UTF-8");
第二种方式是获取页面提交方式为“GET”的数据时,必须使用String类的构造方法对字符串进行重构,并指定重构的字符编码和重构后的字符编码。
//获取请求参数为name的数值
String name = reqeust.getParameter(“name”);
//将该参数值的编码类型有ISO8859-1改为UTF-8
name = new String(name.getBytes(“ISO8859-1”),"UTF-8");
3、数据响应时输出中文出现乱码的问题
JSP页面中含有中文变量的值输出到JSP页面出现了乱码时,可以设置响应报文的MIME类型。
//设定响应报文的MIME类型
response.setContentType(“text/html;charset=UTF-8”);
4、数据库连接出现乱码
这种情况发生在,程序向数据库中保存含有中文信息的记录时变成乱码,或者在读取含有中文的记录时显示为乱码。下面以Mysql数据库为例解决该问题:
//指定连接数据库为本地database数据库,支持Unicode并且字符编码为UTF-8
String UR L= "jdbc:mysql://localhost:3306/database?userUnicode=true&characterEncoding=UTF-8"
5、数据库显示中文信息的乱码问题。
程序访问Mysql数据库中的数据时出现中文乱码问题,原因在于数据表中数据存储的编码方式和程序中的编码不同。
第一种:解决方案创建一个转换字符编码的公共类。(不推荐)
第二种:打开Mysql客户端并输入以下SQL语句
set character_set_client = UTF-8;
set character_set_results = UTF-8;
set character_set_connection = UTF-8;
之后,再将Mysql安装目录下my.ini文件中的default-character-set的值改为UTF-8(注意,文件中有两处需要更改)。
第三种:安装Mysql时,在Mysql的配置向导中设置为支持中文字符的字符集即可,这种方法是最方便,并且也是必然会遇到的。