`

乱码(三): 问题的出发点

阅读更多



    在乱码(一): 北京西直门迷路与乱码困惑 里, 笔者以"散文"的方式记叙了初次遇到乱码问题的心境. 不管心静好坏,问题还得要解决的. 在Linux 文件上传时目录汉字乱码问题??? 问答里, 记录了问题的起因以及围绕此问题的几次补充, 在此在特意感谢网友aone 的回答.
    为了下文讨论的方便, 这里再简短介绍下问题. 是这样的, 项目没问题也已经要正式发布了, 测试时是在一台Linux系统(这里记为A机)上的, 但A机好像是坏了, 正式用就把项目部署到另一台Linux机(记为B机)上. 但出问题了, 在A机上跑的很好的文件上传代码出乱码了.
    代码在A机上跑的好好的但在B机上不行, 应该是B机上配置有不合适的地方, 但A机坏了, 这样也就死无对证没法参考A机上的配置, 从头开始改配置.

    为了能高效地解决问题, 先梳理下现在项目中防止乱码做的保证, 毕竟这是问题的出发点, 也对自己以后解决同类问题有很大的借鉴作用.

        1, struts.xml文件中<constant name="struts.i18n.encoding" value="UTF-8"></constant>
        2, web.xml中加了如下的Filter:
            <filter>

        <filter-name>encodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

      3, 有的JSP文件中加如下代码:
            <%@ page language="java" errorPage="/error.jsp" pageEncoding="gbk "  contentType="text/html;charset=utf-8 "%>
        大多JSP中是:
            <%@ page language="java" errorPage="/error.jsp" pageEncoding="utf-8 " contentType="text/html;charset=utf-8 " %>

        没有设置网上常见的:
                <%

 request.setCharacterEncoding("UTF-8"); // --- (1)
%>
可能原因是web.xml中配置了 CharacterEncodingFilter中已加了类似的处理.
CharacterEncodingFilter源码, 发现" request.getCharacterEncoding() == null ",也就是说,JSP页面中可能通过 (1)处的设置来覆盖这个filter中的配置.
        if (this.encoding != null && (this.forceEncoding || request.getCharacterEncoding() == null )) {
            request.setCharacterEncoding(this.encoding);
            if (this.forceEncoding && responseSetCharacterEncodingAvailable) {
                response.setCharacterEncoding(this.encoding);
            }
        }
        responseSetCharacterEncodingAvailable变量是这样的获得的;
            private final static boolean responseSetCharacterEncodingAvailable = ClassUtils.hasMethod(HttpServletResponse.class,"setCharacterEncoding", new Class[] {String.class});

    4, Tomcat的server.xml文件中:
        <Connector port="80" maxHttpHeaderSize="8192"
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" redirectPort="8443" acceptCount="100"
               connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="UTF-8 " useBodyEncodingForURI="true"/>

    5, Java代码中负责Ajax响应的代码:
           public void listCityByProId() {
         getResponse().setContentType("text/xml;charset=utf-8 ");
         getResponse().setHeader("Cache-Control","no-cache");
         try{//response写信息
                // do something here.
         }catch(IOException e){
            e.printStackTrace();
         }
    }

    项目中用的是UTF-8的编码, 这是问题的出发点.

 

1
1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics