我遇到了一种奇怪的编码情况,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>
A
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 字符一样(无论是这些字符来自数据库或资源文件)。
因此,例如,名称“ 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 案例中不存在。
谁能弄清楚到目前为止我逃脱了什么?或者,欢迎提出关于我应该进行什么样的调查以查明真相的建议!