Tomcat + Wicket:UTF-8字符无法正确呈现

Geo*_*old 5 html tomcat wicket utf-8

我有一个Wicket应用程序,其中一些页面包含重音字符,输入为UTF-8,例如"résumé".

当我通过传统的Wicket Start.java类(调用嵌入式Jetty服务器)调试应用程序时,一切都很好.但是,当我尝试部署到本地Tomcat实例时,它呈现为"r√©sum√©".

我的文档看起来像:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="en-US"
      xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd">
<head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>

<body>
   résumé
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

以下是curl -I在Jetty上运行时返回页面的内容:

HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Content-Language: en-US
Pragma: no-cache
Cache-Control: no-cache, max-age=0, must-revalidate
Content-Length: 13545
Server: Jetty(6.1.25)
Run Code Online (Sandbox Code Playgroud)

这就是Tomcat返回的内容:

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Pragma: no-cache
Cache-Control: no-cache, max-age=0, must-revalidate
Content-Type: text/html;charset=UTF-8
Content-Language: en-US
Transfer-Encoding: chunked
Date: Sat, 23 Jul 2011 14:36:45 GMT
Run Code Online (Sandbox Code Playgroud)

Wol*_*ang 12

问题是Wicket没有正确检测标记文件的编码.它们编码为UTF-8,因此非ASCII字符由两个字节表示.但Wicket并不知道这一点并将它们视为两个独立的角色.然后在响应中将这两个字符再次编码为UTF-8.由于"平方根"字符不是ANSI本身,因此实际上应该在响应中看到每个é 三个字节.

无论如何,您需要修复此标记编码解释.查看XMLReader #init()的Wicket源代码.

它读起来就像Wicket尝试了三个关于标记文件编码的东西:

  1. 评估<?xml ... ?>标记文件开头的声明.(对你的思念?)
  2. 使用指定的默认编码 Application#getMarkupSettings().setDefaultMarkupEncoding(String)
  3. 使用操作系统默认值.

看起来好像缺少1和2,所以Wicket回落到3,这在你的情况下不起作用.所以尝试其他两个.


Geo*_*old 6

我不确定为什么需要这样做,但这是解决这个问题的解决方法:

public class Application extends WebApplication
{
    @Override
    protected void init()
    {
        getRequestCycleSettings().setResponseRequestEncoding("UTF-8"); 
        getMarkupSettings().setDefaultMarkupEncoding("UTF-8"); 
    }
}
Run Code Online (Sandbox Code Playgroud)

为了给予应有的信用,我在这里找到了这个解决方案.