java中文参数乱码解决方案

来源:互联网 发布:幸运飞艇源码下载 编辑:程序博客网 时间:2024/05/21 22:48

中文参数乱码是在开发中一直都有遇到的问题,之前也碰到过几次,现在在这里做一个归纳总结吧。

1、产生乱码的原因

① 编码解码集不一致

② 长度缺失(这种情况一般是在读取文件的时候因为readLine读取的字节数不够导致)


2、项目在部署环境下的编码、解码原理

要了解乱码产生的原因需要先了解编码与解码在一次请求中经历了怎样的过程:

①页面发送一个请求,编码集为页面设置的编码

 < %@ page language="java" import="java.util.*" pageEncoding="utf-8"%>

 <meta http-equiv="content-type" content="text/html; charset=UTF-8"> //这就相当于给客户端发送了响应头content-type,

②服务器(tomcat)接收请求会根据自身的编码方式对参数进行编码,默认是IOS-8859-1。

③后台接收请求使用项目设置的编码方式进行解码。

因为中间有tomcat会对请求进行编码,这也就是为什么页面设置的编码集与项目的编码集一致时为什么还会出现乱码的原因


解决方案一:在java中使用getBytes()

new String(request.getParameter("qrcodeName").getBytes("ISO8859-1"),"utf-8");

注:这种方案具有一定的局限性,getBytes是将获取到的参数使用IOS8859-1进行解码然后再通过UTF-8进行编码(这里也印证了上面的②说法)

说明:使用这种方案的前提是你一定要知道中间件的编码集是什么,否则依旧是乱码的情况。


解决方案二:获取请求参数之前先通过request.setCharacterEncoding()来指定服务器解码请求参数时使用的编码字符集,然后再使用reuqest.getParameter()方法来获取请求参数,那么就是用指定的编码来读取了。

request.setCharacterEncoding(“utf-8”);

String name =request.getParameter(“name”);

注:与一类似也存在局限性,如果是POST请求,服务器可以指定编码!但如果没有指定编码,那么默认还是使用ISO-8859-1来解读。当客户端通过GET请求发送数据给服务器时,没有方法可以设置它的编码,因为参数在url中。使用request.getParameter()获取的数据是被服务器误认为ISO-8859-1编码的,也就是说客户端发送过来的数据无论是UTF-8还是GBK,服务器都认为是ISO-8859-1。

说明request.setCharacterEncoding(“utf-8”);//设置请求的编码集 只对post有效,get设置无效


知识点引申:

response.setContentType(“text/html;charset=utf-8”);与response.setCharacterEncoding(“utf-8”)的比较:

response.setCharacterEncoding(“utf-8”);

response.getWriter().print(“传智”);

上面代码因为在使用response.getWriter()输出之前已经设置了编码,所以输出的数据为utf-8编码。但是,因为没有告诉浏览器使用什么编码来读取响应数据,所以很可能浏览器会出现错误的解读,那么还是会出现乱码的。

当然,通常浏览器都支持来设置当前页面的编码,如果用户在看到编码时,去设置浏览器的编码,如果设置的正确那么乱码就会消失。但是我们不能让用户总去自己设置编码,而且应该直接通知浏览器,服务器发送过来的数据是什么编码,这样浏览器就直接使用服务器告诉他的编码来解读!这需要使用content-type响应头。

response.setContentType(“text/html;charset=utf-8”);

response.getWriter().print(“传智”);

上面代码使用setContentType()方法设置了响应头content-type编码为utf-8,这不只是在响应中添加了响应头,还等于调用了一次response.setCharacterEncoding(“utf-8”),也就是说,通过我们只需要调用一次response.setContentType(“text/html;charset=utf-8”)即可,而无需再去调用response.setCharacterEncoding(“utf-8”)了。

参考博客地址:http://blog.csdn.net/qq_29028175/article/details/53559199


解决方案二:通过encodeURI来解决中文乱码问题Jsp:使用encodeURI(encodeURI("参数"));

Javajava.net.URLDecoder.decode(request.getParameter("参数"),"UTF-8");

注:前端在进行encode编码是,为什么用了两次encodeURI,而服务器后端在解码时只解了一次?原因是:容器会默认帮你解一次码。此时,你可能又要问了,既然容器会默认解一次码,那么为什么不直接在前端只进行一次encode,服务端程序直接request.getParameter(“star_name”) ?画蛇添足了吧?原因是:容器默认解码时采用的编码是容器的默认编码,可能是UTF-8,GBK,也可能是其他编码方式。这与你的应用的编码方式未必会一致。所以你直接获取的话可能会出现乱码。

参考博客:

http://blog.csdn.net/u012027337/article/details/52126475

http://blog.csdn.net/zhxtpray/article/details/52440076

说明:

这种方式能解决绝大部分乱码情况,就是需要修改程序,通用性不强。



解决方案四:(推荐)修改tomcat安装目录下的server.xml

<Connector port="8080" protocol="HTTP/1.1"

               connectionTimeout="20000"

               redirectPort="8443" URIEncoding="UTF-8"/>


注:如果没有生效则到myeclipse工作空间.metadata\.me_tcat7\conf\server.xml对应加上如配置。博客参考地址:http://blog.csdn.net/happyrabbit456/article/details/51046172?locationNum=6&fps=1

说明;这种解决方案是最具通用性的,也无需修改程序。



感谢博客大牛分享的知识,也算是站在巨人的肩膀上看世界了。文章中的内容只是自己的一些理解,如果有什么错误的地方欢迎指正微笑