代码之家  ›  专栏  ›  技术社区  ›  pierdeux

主页和dojo对话框之间的编码差异

  •  1
  • pierdeux  · 技术社区  · 17 年前

    我有一个奇怪的编码情况,html页面本身会按原样显示(所有访问的字符都正确显示),但所有弹出式dojo对话框都无法使用正确的编码。

    设置如下:

    • 在Tomcat6.0.18上运行Hibernate/Spring/Struts2的Java web项目;这些页面是作为JSP图块生成的,由Tiles2组装在一起。
    • 所有源文件都是UTF-8编码的, 除了 对于资源属性文件( *.properties )它们在ISO-8859-1中(根据Java规范)。
    • 数据库采用UTF-8编码。
    • struts.xml 包含常量的定义:

      <constant name="struts.i18n.encoding" value="UTF-8"/>
      
    • 每个JSP图块都以以下语句开头

      <%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
      
    • 每个JSP页面(由几个图块组成)都以以下语句开头

      <%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
      <?xml version="1.0" encoding="UTF-8"?>
      
    • 从JSP代码生成的每个HTML页面都包含以下内容 <head> 元标签:

      <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
      
    • Tomcat编码过滤器为 every single request going through Tomcat 值:

      text/html;charset=UTF-8
      
    • dojo 1.2.3在每个页面上都使用以下语句进行初始化

      <script type="text/javascript" src="/scripts/dojo/dojo/dojo.js" djConfig="parseOnLoad:true,usePlainJson:true,locale:'fr'"></script>
      
    • A. dijit.Dialog 首先创建,然后通过以下语句打开( /votingOptions 操作URL返回一个遵循与前面相同规范的JSP代码段——该JSP代码段最终嵌入到 <div> 对话框):

      dialog = new dijit.Dialog({title:"My title",loadingMessage:"Loading..."});
      dialog.setHref('/votingOptions');
      dialog.show();
      

    所有这些设置的结果是,所有“正常”页面(即抛开dojo对话框)都会按原样显示所有字符、重音符号和所有字符,无论文本来自数据库还是资源文件。

    另一方面,任何dojo对话框的内容都会被破坏:所有非重音字符都很好,但重音字符的显示方式就像试图将UTF-8字符读取为ISO-8859-1字符一样(无论这些字符是来自数据库还是来自资源文件)。

    例如,名字“ 库尔特·哥德尔 “(正如它在主页上正确显示的那样)将显示为” 库尔特·哥德尔 “在dojo对话框中!

    请注意,Firebug在两种情况下(无论是调用主页,还是在页面上打开dojo对话框)都报告了与Tomcat相同的响应头:

    Server: Apache/2.2.3 (CentOS)
    Content-Language: en-US
    Connection: close
    Content-Type: text/html;charset=UTF-8
    

    这两种类型的请求(除了Content-Length)之间的唯一区别是:

    Transfer-Encoding: chunked
    

    这在请求主页时存在,但在dojo对话框中不存在。

    有人能猜出到我到目前为止逃脱了什么吗?或者,欢迎就我应该进行什么样的侦查来深入了解此事提出建议!

    2 回复  |  直到 17 年前
        1
  •  0
  •   Leonel    17 年前

    Dojo中的Dialog小部件调用URL/votingOptions,我假设它是由servlet或Struts操作处理的。

    因为这是一个Ajax调用,我还假设如果您使用的是struts操作,那么您将通过 HttpServletResponse 对象,而不是重定向到视图。

    无论哪种方式,请确保使用:

    String str = "こんにちわ、 Kürt Gödel";
    response.getWriter().write(str);
    

    而不是:

    response.getOutputStream().println(str);
    

    我能够用这些代码重现你所经历的行为。第一个正确显示所有字符(甚至是日语字符!),第二个显示乱码信息。

    由于您正在开发Ajax应用程序,请确保安装 HttpFox 插件,它比Firebug更能显示Http流量。

        2
  •  0
  •   Guillermo Vasconcelos    17 年前

    我也有类似的问题。
    在我的例子中,dojo javascript文件以iso-8859-1格式返回。为了解决这个问题,我必须重写默认FilterDispatcher类中的方法getContentType()。我将其替换为以下代码(在Struts 2.0.9中测试):

    
    protected String getContentType(String name) {
            if (name.endsWith(".js")) {
                return "text/javascript;charset=\"UTF-8\"";
            } else if (name.endsWith(".css")) {
                return "text/css";
            } else if (name.endsWith(".html")) {
                return "text/html;charset=\"UTF-8\"";
            } else if (name.endsWith(".txt")) {
                return "text/plain";
            } else if (name.endsWith(".gif")) {
                return "image/gif";
            } else if (name.endsWith(".jpg") || name.endsWith(".jpeg")) {
                return "image/jpeg";
            } else if (name.endsWith(".png")) {
                return "image/png";
            } else {
                return null;
            }
    }
    
    推荐文章