史上最全Servlet中的中文乱码分析与解决问题

  在Servlet中接收浏览器的数据以及发送数据到浏览器的时候容易遇到一些中文显示乱码的问题,下面是博主对这类问题的一个总结,希望能帮到大家!

一、问题分析
  当我们的Servlet程序从客户端接收到一个中文数据或者发送一个中文数据到服务器端的时候,默认情况下会显示为乱码,这是由于编码方式的不同造成的,tomcat从浏览器接收到数据时默认的编码方式是ISO-8859-1的编码格式,这个格式是单字节编码,是不能解析中文的,而当数据接收到服务器的时候又没有按照相同的编码去解析数据,这就导致了中文乱码问题的出现。(这里实力吐槽一波中文在开发中的麻烦之处,不过也没办法,谁让老外那帮哥们早期的编程技术比我们高哈哈哈)*
二、思维导图
乱码情况总结

  可以从思维导图看到中文乱码主要有两种情况*

三、Request(HttpServletRequest)
3.1 GET方法
   HttpServletRequest是Servlet中用于接收客户端请求的对象,我们可以用它的getParameter()方法来获取客户端的对象,例如获取用户在浏览器中输入的姓名:

	String username=request.getParameter("username");

  当用户在浏览器输入中文的时候我们就会接收到乱码,如下在这里插入图片描述
  当我们在写页面的时候定义的是如下语句:

 	<form action="CharacterTest" method="get">

  这时我们走的是我们定义的Servlet程序的doGet方法,所以这是在我们点击提交的时候用户输入的中文就已经被解码并跟在了url地址栏了,如下:
在这里插入图片描述
  这便导致了我们在后台收到的数据是乱码,这时候我们只需要在定义接收username的语句下面定义以下:

  username = new String(username.getBytes(“ISO-889-1”), “UTF-8”);

  下面是我的测试代码:

String username = request.getParameter("username");
// 将拿到的有可能时字符串的数据在解码一次,然后再按utf-8编码
username = new String(username.getBytes("ISO-889-1"), "UTF-8");
System.out.println("username="+username );

  这样我们在后台接收到的语句就是正常的中文了,它的工作原理就是将数据按照ISO-8859-1的编码去解码转换为数组,再用UTF-8的方式加以编码,因为UTF-8支持中文编码。
3.2 POST方法
  当我们再写页面的时候如果定义的是以post方式提交

    <form action="CharacterTest" method="post">

  那么这时候点击提交之后username的值便不会被拼接再url地址栏后面,所以它的中文乱码解决方式和get方式的乱码解决方法是不一样的,具体的解决方法就是在接收username的语句前先提前定义好

    request.setCharacterEncoding("UTF-8");

具体的代码示例如下:

private void postRequestTest(HttpServletRequest request) throws UnsupportedEncodingException {
		System.out.println("这次走的是post方式");
		request.setCharacterEncoding("UTF-8");
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		System.out.println(username + "-----" + password);
	}

四、Response(HttpServletResponse)
   HttpServletResponse是Servlet中用于发送数据到用户页面,主要有两种输出方式,字符流response.getWriter().getWrite(); 和字节流response.getOutputStream().write();
4.1字符流中文乱码
  当我们要返回中文给客户端的时候,默认情况下会输出中文乱码:

	response.getWriter().write("你好");

  这时客户端的页面上会显示如下:

在这里插入图片描述
这时我们的解决方式如下:

private void writerTest(HttpServletResponse response) throws IOException {
		// 测试字符流输出中文
		//将数据以utf-8的方式编码后发出去,tomcat默认的也是以utf-8的方式发出,所以下面方法里面的utf-8省略也行
		response.setCharacterEncoding("UTF-8");
		//指定浏览器用什么编码解析服务器发出的数据
		response.setHeader("Content-Type", "text/html;charset=UTF-8");
		response.getWriter().write("你好");
	}

  这时浏览器就正常显示出“你好”两个字了。

4.1字节流中文乱码
  这个方式是将数据以字节流的方式发送给客户端,当我们要发送的数据不是纯文本数据的时候就需要以字节流的方式输出。以下还是以文本数据举例,通过java特色链式调用的方法:

 response.getWriter().write("你好");

  同样的默认情况下客户端页面上显示的还是乱码(再次吐槽中国人学编程的艰辛),解决方法如下:

// 测试字节流输出中文
// 1.设置以utf-8的编码格式将字符串转换为数组
response.getOutputStream().write("你好哦".getBytes("UTF-8"));
// 2.设置接收他的流浪器用什么编码解析这个文档
response.setHeader("Content-Type", "text/html;charset=UTF-8");

这就是目前博主所知道的关于tomcat客户端与服务器端之间通信时所产生的中文乱码问题的解决方案。
如果有帮到你的话可以点个赞吗^ 0 ^

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章