中文乱码问题
当页面提交一个包含中文的请求时,在服务端可能会出现中文乱码问题
乱码产生的原因
Http协议中规定,数据的传输采用字节编码的形式,无论浏览器提交的数据包含的中文是什么字符编码形式,一旦由浏览器经过Http协议传输,则这些数据均以字节的形式上传给服务器。因为Http协议底层采用的是TCP协议,TCP是一种面向连接的,可靠的,基于字节流的,端对端的通信协议,在请求中,这些字节均以%开头,并以十六进制形式出现,
那么,乱码是如何产生的呢?
当用户通过浏览器提交一个包含UTF-8编码格式的两个字的中文请求的时候,浏览器会将这两个中文字符变为六个字节(一般一个UTF-8汉字会占三个字节),即形成六个类似%8E的字节表示形式,并将这六个字上传至tomcat服务器。
Tomcat服务器在接受这六个字节后,并不知道他们是什么字节编码,而Tomcat默认的编码格式是ISO8859-1,所以会将这六个字按照ISO-8859-1的格式进行编码。编码后在控制台显示,所以控制台会显示乱码。
要注意一点,当前tomcat9已经解决了表单get方式提交的中文乱码问题,但是其他版本并没有解决。
POST中文乱码解决方式
-
POST通过request body传递参数。
-
request.setCharacterEncoding("UTF-8"); 这句话解决了POST方式提交的中文乱码问题,这个方法设置了请求正文中的字符编码,所以服务器解析的时候会按照UTF-8的形式进行解码。但是这个方法对get方式没有效果。3
GET中文乱码解决方式
-
GET方式通过url进行传递参数。
-
// 下面的方式可以解决post或者get方式的中文乱码问题 // 这里接收的name是iso8859-1的字符编码 String name = request.getParameter("username"); // 将name字符串按照原来字符编码打散 byte[] bytes = name.getBytes("ISO8859-1"); // 将bytes字节数据按照指定字符编码字符编码进行组装,组装为String name = new String(bytes, "UTF-8"); //真正的写法:name = new String(name.getBytes("ISO8859-1"), "UTF-8");
-
如果用的IDE是myeclipse,找到服务器(tomcat)文件夹,找到conf文件夹,找到server.xml,大概是在71行左右,
在末尾填上URIEncoding="UTF-8",就可解决。eclipse可以直接在 下进行改动。(但这个方法并不可取)