несоответствие кодировки между «главной» страницей и диалогом додзё - PullRequest
1 голос
/ 07 февраля 2009

У меня странная ситуация с кодировкой, когда сама HTML-страница отображается так, как должна (со всеми должным образом отображенными акклиматизированными символами), но все всплывающие диалоги додзё не могут использовать правильную кодировку.

Вот настройка:

  • веб-проект Java с Hibernate / Spring / Struts2, работающим на Tomcat6.0.18; страницы генерируются в виде плиток JSP, собранных вместе Tiles2.
  • все исходные файлы имеют кодировку UTF-8, , за исключением для файлов свойств ресурса (*.properties), которые находятся в ISO-8859-1 (согласно спецификациям Java).
  • База данных в кодировке UTF-8.
  • 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"?>
    
  • Каждая HTML-страница, сгенерированная из кода JSP, содержит следующий метатег <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 сначала создается, а затем открывается с помощью следующих операторов (action-URL /votingOptions, возвращающий фрагмент 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.

Кто-нибудь может понять, что мне удалось избежать? В качестве альтернативы, приветствуются предложения относительно того, какой вид слежки я должен выполнить, чтобы разобраться в этом!

Ответы [ 2 ]

0 голосов
/ 12 августа 2009

У меня была похожая проблема.
В моем случае файлы javascript dojo были возвращены в формате iso-8859-1. Чтобы это исправить, мне пришлось переопределить метод getContentType () в классе FilterDispatcher по умолчанию. Я заменил его следующим кодом (проверено в 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;
        }
}
0 голосов
/ 16 февраля 2009

Виджет «Диалог» в Dojo вызывает URL-адрес / voiceOptions, который, как я полагаю, обрабатывается сервлетом или действием Struts.

Поскольку это Ajax-вызов, я также предполагаю, что если вы используете действие struts, то вы отправляете ответ через объект HttpServletResponse вместо перенаправления в представление.

В любом случае, обязательно используйте:

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

вместо:

response.getOutputStream().println(str);

Мне удалось воспроизвести поведение, которое вы испытывали с этими частями кода. Первый показывает все символы правильно (даже японские!), Второй показывает искаженное сообщение.

Поскольку вы разрабатываете приложение Ajax, также обязательно установите плагин HttpFox , который лучше показывает трафик Http, чем Firebug.

...