gpt4 book ai didi

tomcat - "main"页面和 dojo 对话框之间的编码差异

转载 作者:行者123 更新时间:2023-11-28 22:33:40 25 4
gpt4 key购买 nike

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

这是设置:

  • 在 Tomcat6.0.18 上运行 Hibernate/Spring/Struts2 的 Java 网络项目;页面生成为 JSP tiles,由 Tiles2 组装在一起。
  • 所有源文件都是 UTF-8 编码的,除了资源属性文件 ( *.properties ) 是 ISO-8859-1(根据 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 页面(由多个图 block 组成)以语句开头

    <%@ 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 的 header 到值:

    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 一样那些(无论这些字符来自数据库还是来自资源文件)。

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

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

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 情况下不存在。

谁能弄清楚到目前为止我漏掉了什么?或者,欢迎就我应该进行何种侦查以查明真相提出建议!

最佳答案

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

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

无论哪种方式,请务必使用:

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

代替:

response.getOutputStream().println(str);

我能够使用这些代码重现您遇到的行为。第一个正确显示所有字符(甚至是日文!),第二个显示乱码。

由于您正在开发 Ajax 应用程序,因此还要确保安装 HttpFox插件,比 Firebug 更擅长显示 Http 流量。

关于tomcat - "main"页面和 dojo 对话框之间的编码差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/523195/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com