参数乱码问题解决大全

请求参数乱码问题

问题描述: 在通过request对象获取请求参数时, 如果参数中有中文数据, 在获取时就会出现乱码, 其原因是由于浏览器发送参数时(编码时)使用的码表 和 服务器在结束数据时(解码时)使用的码表不一致造成的!
(1)浏览器发送数据时使用的码表: 浏览器在发送数据时使用的码表取决于打开页面时使用的码表, 即浏览器使用什么编码打开页面, 就会使用相同的编码来发送数据. 这里使用的是utf-8这个码表!
(2)服务器接收数据时使用的码表: 服务器在接收数据时默认使用iso8859-1来接收请求参数
解决方案:让编码时使用的码表和解码时使用的码表保持一致即可!!!
在这里插入图片描述
一、通过手动编解码来解决乱码!!
(1)根据获取到的乱码字符串, 反向编码得回正确的二进制数据
在这里插入图片描述
(2)将二进制数组查询utf-8码表转成字符串, 得回正确的数据
在这里插入图片描述
二、如果发送请求的方式是POST提交, 还可以通过request提供的方法来解决乱码:
request.setCharacterEncoding(“utf-8”); 这行代码是通知服务器使用utf-8来接收请求实体内容中的数据.
由于POST提交的参数刚好在请求实体内容中, 所以这行代码可以解决POST提交时产生乱码问题.
在这里插入图片描述
但是由于GET提交的参数在请求行中的请求资源路径后面拼接着, 不在请求实体内容中, 所有这行代码对GET提交产生的乱码不会起作用!
在这里插入图片描述
三、通过在tomcat中的server.xml文件中找出如下代码,照样修改可以解决get请求的乱码

四、在数据库配置属性文件的连接路径后面加上编码定义语句如下所示,可以解决post请求乱码
jdbcUrl=jdbc:mysql:///jtsys?useUnicode=true&characterEncoding=utf-8

响应参数乱码问题

字节流发送乱码产生原因
(1)服务端在发送数据,数据使用的编码是GBK(字符串转成二进制数组调用的是getBytes(),这个方法如果不指定,将会使用默认的平台码GBK)
(2)浏览器自己有默认的编码(比如谷歌),如果不指定,默认使用utf-8来接收数据. 发送数据和接收数据使用的码表不一致造成乱码。
字符流乱码产生的原因:
(1)服务器端使用字符流发送数据,底层需要将字符转成字节,这时需要使用一个码表,如果不指定,服务器默认使用iso8859-1编码,而这个编码中没有中文汉字,所以必然会出现乱码!
(2)无论客户端使用什么编码,接收到的数据都是乱码!
3、解决的方案:
(1)字节流发送
第一步: 通知服务端使用utf-8来发送数据在这里插入图片描述
第二步: 通知浏览器也使用utf-8来接收数据
在这里插入图片描述
等价于:
在这里插入图片描述
(2)字符流发送
第一步: 通知服务端使用utf-8来发送数据
在这里插入图片描述
第二步: 通知浏览器也使用utf-8来接收数据
在这里插入图片描述
4、总结: 其实在解决字符流发送中文乱码问题的过程中,
response.setCharacterEncoding(“utf-8”);
– 这行代码可以省略不写,原因是因为
response.setContentType(“text/html;charset=utf-8”);
– 这行代码有两个作用,既会通知服务器用utf-8来发送数据,也会通知浏览器使用utf-8来接收数据!

猜你喜欢

转载自blog.csdn.net/qq_42695926/article/details/83006552