Servlet中的乱码问题及解决办法

Posted lijie0609

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Servlet中的乱码问题及解决办法相关的知识,希望对你有一定的参考价值。

假设现在有个form表单,当页面中提交一个包含中文的请求时,在服务端有可能出现中文乱码问题。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action="registerServlet" method="POST">
		姓名:<input type="text" name="name"><br>
		年龄:<input type="text" name="age"><br>
		<input type="submit" value="注册">
	</form>
</body>
</html>

 乱码的产生原因

  Http协议中规定,数据的传输采用字节编码方式,即无论浏览器提交的数据所包含的中文是什么字符编码格式,一旦由浏览器经过Http 协议传输,则这些数据均将以 字节的形式上传给服务器。 因为 HTTP 协议的底层使用的是 TCP 传输协议。 TCP (Transmission Control Protocol) 传输控制协议 ,是一种面向连接的、可靠的、基于字节流的、端对端的通信协议。在请求中,这些字节均以 开头,并以十六进制形式出现。如 %5A%3D 等。

  当用户通过浏览器提交一个包含 UTF 8 编码格式的两个字的中文请求时,浏览器会将这两个中文字符变为六个字节(一般一个 UTF 8 汉字占用三个字节),即形成六个类似 %8E 的字节表 示形式,并将这六个字节上传至 Tomcat 服务器。Tomcat 服务器在接收到这六个字节后,并不知道它们原始采用的是什么字符编码。而Tomcat 默认的编码格式为 ISO 8859-1 。所以会将这六个字节按照 ISO 8859-1 的格式进行编码,这种编码方式不支持中文,这样就出现了乱码。

关于请求的乱码的解决方案

一、针对POST提交方式的解决方案

技术图片

 

 

 

<!--
设置了请求正文的字符编码,服务器解码的时候会按照UTF-8解码
但是这种方式对于GET方式的请求不适用,因为只对请求正文有作用,
GET方式的请求正文为空行,请求的参数出现在请求行
-->
request.setCharacterEncoding("UTF-8");

 二、针对GET提交方式的解决方案

  对于GET方式提交的情况,上述中设置request.setCharacterEncoding("UTF-8");是不会起作用的,因为GET方式的请求参数是在请求行

  目前了解的两种解决方案:

  ①Tomcat的版本影响,我自己试了一下Tomcat的7.*版本的,什么都不设置的话,会有乱码,但是用7.*以上的Tomcat服务器8.*,9.*的版本就不会出现乱码

  ②当我们以GET方式向服务器提交数据的话,在地址栏中,URL中URI部分的参数提交的中文会以字节的方式显示,对于请求路径中所携带参数的解析,由 Tomcat 服务器完成。而 Tomcat 服务器的字符编码默认为 ISO8859-1 ,所以会将请求路径中所携带的数据,按照 ISO8859 1 进行编码。

技术图片

 

  这种情况下我们可以通过修改 Tomcat 默认字符编码的方式来解决 GET 提交方式中携带中文的乱码问题。在 Tomcat 安装目录的 conf/server.xml 中,找到端口号为 8080 的 <Connector>标签,在其中添加 URIEncoding=UTF-8 的设置,即可将 Tomcat 默认字符编码修改为 UTF-8 。

技术图片

 

 

 

 

三、万能的解决方案(比较通用但是还是有弊端)

 

 

 

 

以上是关于Servlet中的乱码问题及解决办法的主要内容,如果未能解决你的问题,请参考以下文章

java servlet 中文乱码问题解决

JSP中的乱码以及Servlet中的乱码问题及解决方案(没有使用AJAX的情况)

Servlet中乱码的处理及理解

jsp和servlet操作mysql中文乱码问题的解决办法

codeblocks中文乱码原因及解决办法

Servlet 中文乱码问题及解决方案剖析