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

时间:2009-02-07 05:19:44

标签: tomcat encoding utf-8 dojo iso-8859-1

我有一个奇怪的编码情况,即html页面本身显示它应该(正确显示所有适当的chäracters),但是所有弹出的dojo对话框都无法使用正确的编码。

以下是设置:

  • 在Tomcat6.0.18上运行Hibernate / Spring / Struts2的Java Web项目;这些页面是作为JSP tile生成的,由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>
    
  • 首先创建dijit.Dialog,然后通过以下语句打开/votingOptions action-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一个(这些字符是来自数据库还是来自资源文件)。

因此,例如,名称“KurtGödel”(因为它将正确显示在主页面上)将显示为“KurtGö¶del”道场对话!

请注意,在两种情况下(无论是调用主页,还是在页面上打开一个dojo对话框),Firebug都会报告与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-dialog情况下不存在的

到目前为止,任何人都能想到逃脱我的是什么吗?另外,我也欢迎提出建议,以便了解我应该进行的调查!

2 个答案:

答案 0 :(得分: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。

答案 1 :(得分: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;
        }
}