假设现在有个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 。
三、万能的解决方案(比较通用但是还是有弊端)
原文地址:https://www.cnblogs.com/lijie0609/p/11825000.html