• SSH开发过程中的中文问题汇总


    本文原创,欢迎转载。转载请在文章明显可见处张贴如下内容:(注意:请保留超链接格式)

    本文为Rainisic原创,欢迎转载,转载请在文章明显可见处张贴原帖信息:

    http://www.cnblogs.com/rainisic/archive/2012/01/11/SSH_Chinese_Encoding.html

      在使用SSH开发的过程中,我们经常会因为各种各样的中文乱码问题而苦恼。之前开发的过程中遇到过一些,但是都没有记录下来,这次,我就遇到的中文问题进行一个汇总,希望能够对大家有所帮助。


    1. 平台环境参数

      操作系统:Windows 7 旗舰版 64位

      JDK版本:JDK 1.6 / JDK 1.7 (此处由于JDK 7 发布不久,所以对两个版本进行测试)

      开发环境:Eclipse Java EE Indigo

      网站容器:Tomcat 7.0

      开发框架:

        Struts 2.3.1.1-GA

        Spring 3.1.0-release

        Hibernate 4.0.0-Final / Hibernate 3.6.9-Final (此处由于Hibernate 4 final 刚刚发布不久,所以对两个版本进行测试)

      

    2. 中文问题汇总

      (1) HTML中未指定文件编码

        问题描述:在HTML中未指定文件编码,在部分浏览器中将会出现中文乱码。

        解决方案:在HTML的head标签中指定文档编码,代码如下(请根据DOCTYPE选择):

    // HTML 4.01 Transitional
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

    // HTML 5
    <meta charset="UTF-8">

      (2) 表单提交使用GET方法

        问题描述:在HTML form 中提交表单的时候使用method="get"导致中文乱码。

        解决方案:form表单的method设置为post,代码如下:

    <form action="test" method="post">
    <input type="submit" />
    </form>

      (3) JSP文件中未指定文档编码类型

        问题描述:在JSP文件中未指定JSP文档编码,在浏览器中会出现中文乱码。

        解决方案:在JSP文件首部增加指定文档编码的代码,代码如下:

    <%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding
    ="UTF-8"%>

      (4) 文件编码不正确

        问题描述:由于Java文件、JSP文件等文件编码不正确,导致中文乱码。

        解决方案:设置文件的默认编码为UTF-8(如果需要使用其他编码,请确保上述两个编码格式与文件编码相同)

        设置方法:

          当前文件编码修改:该文件右键→Properties→Resource,右侧 Text file encoding→Other→UTF-8

          默认文件编码修改:

            0. Windows→Preferences 打开Eclipse配置选项窗口。

            1. General→Content Type,右侧 Text 下面所需要的文件类型Default encoding设置为UTF-8

            2. General→Workspace,右侧 Text file encoding 选择UTF-8

            3. Web→JSP Files,右侧Encoding选择UTF-8(显示的是ISO 10646/Unicode(UTF-8))

            Hint: 可以利用Eclipse配置选项窗口左上处的搜索功能,输入“Encoding”即可找到全部。

      (5) Struts 2 默认编码错误

        问题描述:Struts 2 默认编码为UTF-8,如使用GBK等其他编码则会出现中文乱码。

        解决方案:struts.xml 中设置默认Struts 2 编码,代码如下:

    <constant name="struts.i18n.encoding" value="UTF-8"></constant>

      (6) Request、Response编码错误

        问题描述:由于Response、Request的属性characterEncoding设置错误,导致中文乱码。

        解决方案:添加Filter,用于给Request、Response转码,一定要配置在Struts 2的Filter之后!代码如下:

    /*
    * 用于转码的Filter类。
    */
    public class EncodingFilter implements Filter {

    @Override
    public void destroy() {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
    FilterChain chain) throws IOException, ServletException {

    // Set the request and response character encoding.
    request.setCharacterEncoding("utf-8");
    response.setCharacterEncoding("utf-8");
    chain.doFilter(request, response);
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
    }
    }
    <!-- web.xml中的配置,一定要配置在Struts 2之后! -->
    <filter>
    <filter-name>EncodingFilter</filter-name>
    <filter-class>com.mb.filter.EncodingFilter</filter-class>
    </filter>

    <filter-mapping>
    <filter-name>EncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>


      (7) 实现ServletResponseAware并使用PrintWriter的 Bug

        暂时不确定是Bug,一会我会去看Struts 2源代码以确定是否是Bug,如果是Bug有可能会在将来版本修复。

        问题描述:通过实现ServletResponseAware接口而得到的response没有更改characterEncoding,而导致PrintWriter编码错误。这样出现的乱码问题,乱码的内容是静态HTML的中文中,而不是在后台数据和前台Struts便签显示的内容。(之所以说是Bug,是因为同样实现ServletRequestAware接口,获得的request确是更改过文字编码的。)

        解决方案: 实现ServletResponseAware时手动修改Response的characterEncoding,代码如下:

    @Override
    public void setServletResponse(HttpServletResponse response) {

    // Change the response encoding.
    response.setCharacterEncoding("UTF-8");
    this.response = response;
    try {
    this.out = response.getWriter();
    } catch (IOException e) {
    }
    }

      

      (8) 以上办法都不管用

        问题描述:以上解决方案都不管用的时候,用这个办法试试吧,最后的绝招了。

        解决方案: 修改Tomcat的默认编码,修改方法如下:

          1. 进入Tomcat目录,找到主目录下 /conf/server.xml 文件,使用记事本编辑。

          2. Ctrl + F 搜索“8080”,找到如下代码,并修改。

    <!-- 原有代码 -->
    <Connector port="80" protocol="HTTP/1.1"
    connectionTimeout
    ="20000"
    redirectPort
    ="8443"/>

    <!-- 修改为如下代码 -->
    <Connector port="80" protocol="HTTP/1.1"
    connectionTimeout
    ="20000"
    redirectPort
    ="8443"
    URIEncoding
    ="UTF-8"/>

        修改Tomcat默认编码之后,大多数乱码问题都会被解决。

      以上为我所遇到过的中文乱码问题,如果有不齐全的,希望大家补充。

  • 相关阅读:
    Java JDBC 编程指北
    Java 版学生成绩管理系统,附源码!
    【剑指 Java】第 2 弹:剑指大厂,这份数据库面试总结请收好
    手把手教你制作纯手写电子签名
    【剑指 Java】第 1 弹:靠这份 Java 基础知识总结,我拿到了满意的 Offer
    【剑指 Java】第 3 弹:纯干货,计算机网络面试知识点总结
    深入死磕 Java IO 流
    【剑指 Java】第 4 弹:绝对硬货,Spring 面试知识点总结大全
    聊聊技术写作中的那些神兵利器
    关于ply, obj, 3ds 等三维模型文件的Loader
  • 原文地址:https://www.cnblogs.com/rainisic/p/SSH_Chinese_Encoding.html
Copyright © 2020-2023  润新知