请求参数的乱码问题
问题描述: 在通过request对象获取请求参数时, 如果参数中有中文数据, 在获取时就会出现乱码, 其原因是由于浏览器发送参数时(编码时)使用的码表 和 服务器在结束数据时(解码时)使用的码表不一致造成的!
(1) 浏览器发送数据时使用的码表: 浏览器在发送数据时使用的码表取决于打开页面时使用的码表, 即浏览器使用什么编码打开页面, 就会使用相同的编码来发送数据. 这里使用的是utf-8这个码表!
(2) 服务器接收数据时使用的码表: 服务器在接收数据时默认使用iso8859-1来接收请求参数
解决方案:让编码时使用的码表和解码时使用的码表保持一致即可!!!
可以通过手动编解码来解决乱码!!
(1) 根据获取到的乱码字符串, 反向编码得回正确的二进制数据
String username = request.getParameter("username");
//将乱码逆向编码转回二进制数组
byte[] bytes = username.getByte("iso8859-1");
(2) 将二进制数组查询utf-8码表转成字符串, 得回正确的数据
//手动编码,将二进制数组转成字符(查询 utf-8 这个码表)
username = new String(bytes,"utf-8");
如果发送请求的方式是POST提交, 还可以通过request提供的方法来解决乱码:
request.setCharacterEncoding(“utf-8”); 这行代码是通知服务器使用utf-8来接收请求实体内容中的数据.
由于POST提交的参数刚好在请求实体内容中, 所以这行代码可以解决POST提交时产生乱码问题.
/*
* 这行代码是通知服务器使用utf-8来接收请求实体
* 内容中的数据, 所以对POST提交的乱码起作用!
* 这行代码必须放在任何获取参数的代码之前执行
*/
request.setCharacterEncoding("utf-8");
String username = request.getParameter("username");
但是由于GET提交的参数在请求行中的请求资源路径后面拼接着,不在请求实体内容中, 所有这行代码对GET提交产生的乱码不会起作用!