response解决中文输出乱码问题

     由于计算机中的数据都是以二进制形式存储的,因此,当传输文本时,就会发生字符与字节之间的转换。字符与字节之间的转换是通过查码表完成的,将字符转换成字节的过程称为编码,将字节转换成字符的过程称为解码,如果编码和解码使用的码表不一致,就会导致乱码问题。

     【实现步骤】

            1、创建servlet

             在test项目的cn.klh.response包中编写一个名为ChineseServlet的类,在该类中定义一个中文字符串,然后使用字符输出流输出。

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class ChineseServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		String data = "中国";
                printWriter out = response.getWriter();
                out.println(data);
		
	}	

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}
}

                2、配置映射信息,查看运行结果

                     在web.xml中配置完成ChineseServlet的映射后,启动Tomcat服务器,在浏览器的地址栏输入地址:“http://localhost:8080/test/ChineseServlet”访问ChineseServlet,浏览器的显示结果为“??”,说明发生了乱码问题。实际上此处产生乱码的原因是response对象的字符输出流在编码时,采用的时ISO8859-1的字符码表,该码表并不兼容中文,会将“中国”编码为“63 63”(在ISO8859-1的码表中查不到的字符就会显示63)。当浏览器对接收到的数据进行解码时,会采用默认的码表GB2312,将“63”解码为“?”,因此,浏览器将“中国”二字显示成了“??”。

                      为了解决上述编码错误,在HttpServletResponse接口中,提供了一个setCharacterEncoding()方法,该方法用于设置字符的编码方式,在设置内容前加一行代码,设置字符编码使用的码表为UTF-8。

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class ChineseServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
                response.setCharacterEncoding("utf-8");

		String data = "中国";
                printWriter out = response.getWriter();
                out.println(data);
		
	}	

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}
}

                     在浏览器的地址栏输入地址:“http://localhost:8080/test/ChineseServlet”再次访问ChineseServlet,浏览器显示结果不再为?,但是依然乱码。通过分析发现,这是由于浏览器解码错误导致的,因为response对象的字符输出流设置的编码方式为UTF-8,而浏览器使用的解码方式为GB2312。对于此类错误,可以通过修改浏览器的解码方式解决。对于IE浏览器,点击菜单栏中的查看--》编码--》Unicode(UTF-8)选项,将浏览器的编码方式设置为UTF-8之后浏览器显示结果为“中国”,没有出现乱码。由此说明,通过修改浏览器的编码方式可以解决乱码,但是,这样的做法仍然是不可取的,因为用户每次去修改浏览器编码太麻烦,为此,在HttpServletResponse对象中,提供了两种解决乱码的方式:

                     第一种方式:

//设置HttpServletResponse使用utf-8编码
response.setCharacterEncoding("utf-8");
//通知浏览器使用utf-8编码
response.setHeader("Content-Type","text/html;character=utf-8");

                    第二种方式:

//包含第一种方式的两个功能
response.setContent-Type("text/html;character=utf-8");

                    通常情况下,为了使代码更加简洁,会采用第二种方式。接下来对ChineseServlet进行修改,使用第二种方式解决乱码问题。

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class ChineseServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
                //设置字符编码
                response.setContent-Type("text/html;character=utf-8");

		String data = "中国";
                printWriter out = response.getWriter();
                out.println(data);
		
	}	

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}
}

启动Tomcat服务器,在浏览器 在浏览器的地址栏输入地址:“http://localhost:8080/test/ChineseServlet”重新访问ChineseServlet,浏览器显示出了正确的中文字符。

猜你喜欢

转载自blog.csdn.net/weixin_42078450/article/details/86760176