黑马程序员技术交流社区

标题: 【分享】Java开发过程中中文乱码问题总结 [打印本页]

作者: 狼王    时间: 2013-10-6 19:30
标题: 【分享】Java开发过程中中文乱码问题总结
本帖最后由 狼王 于 2013-10-6 19:40 编辑

     在毕向东老师基础视频的day21中,毕老师讲了一个非常重要的知识点——编码与解码,其中就讲到了乱码的产生的原因以及解决方法,最近我在某个论坛上看到了这篇总结,觉得挺好,与大家分享一下。
1、文件乱码处理
1.1 文件默认编码
    默认使用项目的默认编码
    右击文件->roperties->Resource->Text file encoding
1.2 JSP文件编码
    由于JSP要翻译为Servlet
      <%@ page language="java" pageEncoding="utf-8"%>
2 浏览器与服务器传输数据乱码处理
2.1 浏览器端编码,一般由服务器端告诉浏览器如何解码数据:
2.1.1Servlet
      response.setContentType("text/html; charset=UTF-8"); 或者  response.setCharacterEncoding(“UTF-8”);
2.1.2JSP
      <%@ page language="java" contentType="text/html; charset=utf-8" %>
2.1.3、通用
      <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
2.1.4Javascript传参乱码
    在浏览器端对要传递的中文参数进行编码处理.代码如下:
            //请求参数初始化
            xmlhttp.open("POST",url,true);
         //因为请求方式为POST,所以这里要设置请求头.(如果请求方式为GET,此句代码可以省略)
            xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
            //向服务器端发送参数在服务器端代码:
            xmlhttp.send("name="+encodeURI(encodeURI("星期日")));
    页面jsp保证是utf-8编码
            <%@ page contentType="text/html; charset=utf-8"%>
    接受中文参数
             PrintWriter out = response.getWriter(); //得到response的输出流对象
             String name1 = request.getParameter("name"); //得到KEY"name"的请求参数
             String name = URLDecoder.decode(name1,"utf-8"); //对得到的参数进行解码
             out.print(name); //向浏览器端发送数据
2.1.5热链接传参乱码
    在传参的jsp对中文进行编码:href="new.jsp?name=java.net.URLEncoder.encode("链接")";
    在接受的jsp对中文进行转码:String str = URLDecoder.decode(request.getParameter("name "), "utf-8");
    注:浏览器编码可以由我们手工修改,但最后不要这样,一般让浏览器自动选择即可。
2.2、服务器端编码
    服务器端编码,将客户端传过来的数据进行解码:浏览器默认使用ISO-8859-1进行编码数据,然后将数据传输到服务器,因此我们默认只需要将浏览器发送过来的数据转换为我们需要的编码即可。
2.2.1、最简单方式:
    String username = request.getParameter(“username”);
    username = new String(username.getBytes("ISO-8859-1“), "UTF-8");
2.2.2、比较好的解决方案
     
必须在获取参数之前,调用如下方法先解码 request.setCharacterEncoding(“UTF-8”);
     String username = request.getParameter(“username”);
2.2.3、比较通用方案:在一个Filter中更改所有请求的编码方式:
     A、在src中添加filter来设置编码格式是中文,filter类可以在tomcat的包里面:apache-tomcat-6.0.16.zip\apache-tomcat-6.0.1\webapps\examples\WEB-INF\classes\filters下面,SetCharacterEncodingFilter.java文件
     B、在web.xml中配置,filter,具体配置如下页:
      <filter>
           <filter-name>Set Character Encoding</filter-name>
           <filter-class>filters.SetCharacterEncodingFilter</filter-class>
           <init-param><param-name>encoding</param-name>
           <param-value>utf-8</param-value></init-param>
     </filter>
     <filter-mapping>
           <filter-name>Set Character Encoding</filter-name>
           <url-pattern>/*</url-pattern>
    </filter-mapping>

2.2.4GET提交方式中文乱码解决
     通过修改request.setCharacterEncoding(“UTF-8”);只能解决POST提交方式的请求编码,对GET无效。
     A、最简单解决方案:
     该解决方案不再需要任何额外配置(如filter) TOMCAT默认ISO-8859-1 因此可以设置默认编码为UTF-8解决,在conf\server.xml文件中设置如下 <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding=”UTF-8”/>
    B、在tomcat4之后,可以通过如下配置来解决中文乱码,但必须配置filter
     在conf\server.xml文件中设置如下 <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" useBodyEncodingForURI=“true”/>
     然后request.setCharacterEncoding(“UTF-8”)也可解决GET乱码


作者: 狼王    时间: 2013-10-6 19:31
本帖最后由 狼王 于 2013-10-6 19:35 编辑

3、Java与数据库之间的乱码:
  大部分数据库都支持以unicode编码方式,所以解决Java与数据库之间的乱码问题比较明智的方式是直接使用unicode编码与数据库交互。很多数据库驱动自动支持unicode,如Microsoft的SQLServer驱动。其他大部分数据库驱动,可以在驱动的url参数中指定,如mysql驱动:jdbc:mysql://localhost/MYAPPS?useUnicode=true&characterEncoding=GBK
    或者使用JAVA程序,修改编码,程序如下:
    public class Convert {
        public static String ISOtoGB(String iso){
            String gb;
            try{
                 if(iso.equals("") || iso == null){
                 return "";
            }else{
                 iso = iso.trim();
                 gb = new String(iso.getBytes("ISO-8859-1"),"GB2312");
                 return gb;
           }
           }catch(Exception e){
                 System.err.print("编码转换错误:"+e.getMessage());
                 return "";
           }
     }
}
4、Java与文件/流之间的乱码:
  Java读写文件最常用的类是FileInputStream / FileOutputStream和FileReader / FileWriter。其中FileInputStream和FileOutputStream是基于字节流的,常用于读写二进制文件。读写字符文件建议使用基于字符的FileReader和FileWriter,省去了字节与字符之间的转换。但这两个类的构造函数默认使用系统的编码方式,如果文件内容与系统编码方式不一致,可能会出现乱码。在这种情况下,建议使用FileReader和FileWriter的父类:InputStreamReader / OutputStreamWriter,它们也是基于字符的,但在构造函数中可以指定编码类型:InputStreamReader(InputStream in, Charset cs) 和OutputStreamWriter(OutputStream out, Charset cs)。
bc:mysql://localhost/MYAPPS?useUnicode=true&characterEncoding=GBK


作者: 潘才新    时间: 2013-10-6 22:05
赞一个。
作者: 忄雾飞扬    时间: 2013-10-26 08:01
乔兵版主,您好!论坛里的技术博客书写规范怎么找不到呢?
作者: 狼王    时间: 2013-10-26 11:57
忄雾飞扬 发表于 2013-10-26 08:01
乔兵版主,您好!论坛里的技术博客书写规范怎么找不到呢?

不好意思,我不是乔兵,我叫胡飞,技术博客的书写并没有什么规范,但有一些好的博客可以借鉴,你可以到http://bbs.itheima.com/thread-91964-1-1.html这个里面找张歆明博客的博客
作者: 忄雾飞扬    时间: 2013-10-26 18:27
狼王 发表于 2013-10-26 11:57
不好意思,我不是乔兵,我叫胡飞,技术博客的书写并没有什么规范,但有一些好的博客可以借鉴,你可以到ht ...

嗯,不好意思,谢谢胡飞版主的解惑!
作者: 狼王    时间: 2013-10-26 22:18
忄雾飞扬 发表于 2013-10-26 18:27
嗯,不好意思,谢谢胡飞版主的解惑!

没事,没用自己的名字容易误解
作者: 忄雾飞扬    时间: 2013-10-27 21:36
狼王 发表于 2013-10-26 22:18
没事,没用自己的名字容易误解

在吗?胡飞版主,请教个问题,
我的电脑在工具选项里设置文件类型,然后新建 jar,关联,确定退出后,再到文件类型里看,刚才设置的jar没有了,什么原因?我该怎么解决呢?!!
作者: 狼王    时间: 2013-10-27 22:36
忄雾飞扬 发表于 2013-10-27 21:36
在吗?胡飞版主,请教个问题,
我的电脑在工具选项里设置文件类型,然后新建 jar,关联,确定退出后,再 ...

工具选项里可以设置文件类型吗?到百度上能搜到答案吗?
作者: 忄雾飞扬    时间: 2013-10-28 16:30
狼王 发表于 2013-10-27 22:36
工具选项里可以设置文件类型吗?到百度上能搜到答案吗?

当时急死我了,干脆把电脑关机了——休息了一会儿,心不甘又开机,重新设置,竟然设置成功了,无语,问题出现自己电脑 上?还是怎么回事,也不清楚,反正重启后,就好了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2