我有一个奇怪的编码情况,即html页面本身显示它应该(正确显示所有适当的chäracters),但是所有弹出的dojo对话框都无法使用正确的编码。
以下是设置:
*.properties
),这些文件位于ISO-8859-1中(根据Java规范)。 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情况下不存在的。
到目前为止,任何人都能想到逃脱我的是什么吗?另外,我也欢迎提出建议,以便了解我应该进行的调查!
答案 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;
}
}