日期:2014-05-17  浏览次数:20622 次

初涉Servlet,HTML,JSP之中文乱码问题解决
对于新手来说,最纠结的不是写一个html又或者是写一个Servlet问题,而是各种配置问题。一路走来,各种纠结,各种烦躁,但欣慰的是最终都摆平了,其中印象最深的莫过于关于中文编码的问题了。

第一个碰到的是将form表单发送的中文数据在Servlet中输出的问题
html代码:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gbk">
<title>TestGBK</title>
</head>
<body>
中文测试
<form action ="TestGBK" method = "get">
用户名:<input type = "text" name = "name">
<input type = "submit" value = "登录"> 
</form>
</body>
</html>


Servlet代码:
public class TestGBK extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		PrintWriter out = response.getWriter();
		String name = request.getParameter("name");
		out.write(name);
		System.out.println(name);	}

虽然Servlet返回给用户的界面能正常打印出中文结果,但在控制台却是乱码。表面看上去这没什么,但其实正是解决后面问题的关键。

当往数据库插入数据时,需要传入name,这时问题就出来了,因为传入的name是乱码。在这里先让附上怎么样mysql能正确插入中文数据的方法,顺便读者思考一下问题的解决方案。

配置mysql:
打开C:\Program Files\MySQL\MySQL Server 5.5\bin\目录下的MySQLInstanceConfig.exe,狂按next直到出现
依照图中选择即可。(如果不行,彻底卸载,重装)

好,回到主题,为什么用PrintWriter对象能打印出正确的结果而System.out.println()却不能?这两者肯定有所区别,而且应该是字符集的问题。网上查阅资料,发现response和request的默认字符集都是'ISO-8859-1',而我系统默认的字符集编码是'936 简体中文 GBK'(查系统默认字符集的方法在最下面),为了能够传入正确的中文参数而不是乱码,必须将'ISO-8859-1'编码转化成'GBK'编码,查阅知可通过如下方法:
String name2 = new String(name.getBytes("ISO-8859-1"),"gbk");
out.write("<hr />");
out.write("PrintWriter打印-------"+name2);
System.out.println("System.out.println打印的对象-------"+name2);


这个时候发现PrintWriter打印的name2为乱码,而且"打印的对象"这五个字也乱码了,而控制台能够清晰地打印出name2属性。查阅知,通过response.setContentType("text/html;charset=gbk")来设置静态页面能够显示中文,设置后,就会发现PrintWriter打印的name2又能够正常输出了,但name1却变成乱码,这是因为name2是gbk编码而name1是ISO-8859-1编码的缘故。这就代表有两种方案可执行,笔者这里选择了把静态页面设置成gbk。

将转换成gbk的name2属性作为参数传入数据库(如果传入name1则会传入乱码),打印,发现结果正常。

补充:写JSP页面时有个值得注意的地方,一定要先把pageEncoding改成gbk,否则保存的时候会出现
这里千万不能选save as UTF-8不然会出现静态页面和控制台中文不能正常显示的结果。

查系统默认字符集 1.运行--cmd--chcp, 得到一个“活动的代码页:936”;2.控制面板--区域和语言选项--高级--代码页转换表,对照代码页转换表可以得到系统默认的编码格式,如:936 简体中文 GBK;。

附上测试源码:TestGBK.rar