Tomcat + Wicket: символы UTF-8 неправильно отображаются - PullRequest
5 голосов
/ 23 июля 2011

У меня есть приложение Wicket с несколькими страницами, содержащими акцентированные символы, введенные как UTF-8, например "Возобновить".

Когда я отлаживаю приложение через традиционный класс 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>

Вот что 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)

А вот что возвращает 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

Ответы [ 2 ]

12 голосов
/ 24 июля 2011

Проблема в том, что Wicket неправильно определяет кодировку файлов разметки. Они кодируются как UTF-8, поэтому не-ASCII-символы представлены двумя байтами. Но Уикет не знает об этом и читает их как двух отдельных персонажей. Эти два символа затем кодируются как UTF-8 снова в ответе. Поскольку символы «квадратный корень» - это не ANSI, вы должны увидеть в ответе три байта на один.

В любом случае, вам нужно исправить эту интерпретацию кодировки разметки. Получите исходный код Wicket для XMLReader # init ().

Читается, как Wicket пытается выяснить три вещи о кодировке файла разметки:

  1. Оценивает объявление <?xml ... ?> в начале файла разметки. (Скучаю по тебе?)
  2. Использует кодировку по умолчанию, указанную Application#getMarkupSettings().setDefaultMarkupEncoding(String)
  3. Использует ОС по умолчанию.

Похоже, в данный момент отсутствуют 1 и 2, поэтому Wicket возвращается к 3, что не работает в вашем случае. Так что попробуйте любой из двух других.

6 голосов
/ 24 июля 2011

Я не уверен, зачем это нужно, но вот обходной путь, который решил это для меня:

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

Чтобы отдать должное, где это необходимо, я нашел это решение здесь .

...