1

我遇到了一种奇怪的编码情况,html 页面本身按应有的方式显示(所有重音字符都正确显示),但所有弹出的 dojo 对话框都无法使用正确的编码。

这是设置:

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

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

    <%@ 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>
    
  • Adijit.Dialog首先由以下语句创建然后打开(/votingOptionsaction-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 字符一样(无论是这些字符来自数据库或资源文件)。

因此,例如,名称“ Kurt Gödel ”(它会正确显示在主页上)将在道场对话框中显示为“ Kurt Gödel ”!

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

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-dialog 案例中不存在。

谁能弄清楚到目前为止我逃脱了什么?或者,欢迎提出关于我应该进行什么样的调查以查明真相的建议!

4

2 回答 2

0

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插件,该插件在显示 Http 流量方面比 Firebug 更好。

于 2009-02-16T20:15:14.207 回答
0

我有一个类似的问题。
在我的例子中,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;
        }
}
于 2009-08-12T15:36:41.190 回答