Странные проблемы с кодировкой символов в Eclipse / Spring / Tomcat 6 - PullRequest
3 голосов
/ 04 января 2011

Я пробовал вещи весь день, но не могу найти правильное решение.Моя проблема: я разрабатываю приложение на основе Spring MVC в своем локальном Tomcat.В моей базе данных MySQl установлена ​​кодировка UTF-8, все содержимое там отображается правильно при использовании phpMyAdmin.Также вывод в файлах LOG, использующих log4j в catalina.out, работает нормально.

Мои страницы JSP настроены на

<!-- encoding -->
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ page pageEncoding="UTF-8" %>

Также хорошо отображаются данные на моем JSP.Я также могу отправлять данные из моего контроллера без вмешательства в БД с помощью специальных символов, например

String str = "UTF-8 Test: Ä Ö Ü ß è é â";
logger.debug(str);
mav.addObject("utftest", str);

, которые правильно отображают в журнале и на странице jsp в браузере .

НО: при наличии специальных символов непосредственно в моем файле JSP, например, для текста в заголовках, это не работает.FF и Google Chrome отображают странные символы, но сообщают, что страница имеет формат UTF-8.При переключении на латиницу символы становятся все более и более странными.

Та же проблема при отображении текстовых токенов из моего файла messages.properties, хотя при щелчке правой кнопкой мыши Eclipse сообщает, что будет использоваться UTF-8.

Я немного растерялся и не знаю, где сейчас проверить.

Резюме:

  • Хранилище БД в порядке
  • Вывод БД включенJSP в порядке
  • Вывод на JSP напрямую контролер формы в порядке
  • даже чтение в формах в порядке
  • .properties файлы и JSP текст не в порядке !!!

Есть идеи?Я действительно ценю и советы.

Ответы [ 5 ]

6 голосов
/ 23 сентября 2011

Квест

У меня точно такая же проблема, как у вас с очень похожей конфигурацией (Tomcat, Spring, Spring Web Flow, JSF2).

Небольшие факты о моих собственных исследованиях:

  • WAR в Tomcat Window: проблема с кодировкой,
  • то же WAR в Tomcat Linux: нет проблем → подозревать кодировку ОС по умолчанию, так как Linux в UTF-8,
  • то же самоеWAR под Tomcat, запускаемый Eclipse WTP в Windows: без проблем → WTF?!
  • передача файлов свойств в UTF-8 с натуральными латинскими символами вместо заполнителей юникода: решить проблему для внешних меток,
  • то же самое в Facelets (страницы JSF2): всегда решайте проблему, единственное, что работает, это <f:verbatim>&amp;eacute;</f:verbatim>.

Проблема по-прежнему возникает после проверки всего моего кода на наличие классических предпосылок и рекомендаций, найденных на форумах.:

  • <?xml version="1.0" encoding="UTF-8" ?> в верхней части файлов XML,
  • <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> внутри заголовка HTML тех же файлов,
  • encoding="UTF-8" в <f:view>.

КонНастройка Tomcat следующими способами ничего не сделала:

  • URIEncoding = "UTF-8" на соединителе в server.xml (нормально, поскольку это касается кодировки URI, а не кодировки страницы)
  • org.springframework.web.filter.CharacterEncodingFilter вкл. И выкл.,
  • и это (я, наверное, здесь упускаю смысл):

    <locale-encoding-mapping-list>
      <locale-encoding-mapping>
        <locale>fr</locale>
        <encoding>UTF-8</encoding>
      </locale-encoding-mapping>
    </locale-encoding-mapping-list>
    

Ключ

Я нашел решение, сравнивающее командную строку Tomcat между WTP и классической командной строкой MS-DOS Tomcat.Единственное отличие - параметр -Dfile.encoding=UTF-8.Для меня это был ключ к решению проблемы.

Установите JAVA_OPTS = -Dfile.encoding = "UTF-8", и он отлично работает.

(попытка) объяснение

Единственное объяснение, которое я нашел, Tomcat использует кодировку JVM, которая по умолчанию является системной кодировкой (UTF-8 в Linux, CP1252 в Windows).Eclipse WTP принудительно использует кодировку JVM в соответствии с настройками кодирования рабочей области.Передача JVM в UTF-8 дает решение.

Я подозреваю, что оно не совсем правильное и что есть проблема с конфигурацией либо в моем стеке, либо при фильтрации ресурсов, выполняемой либо с помощью maven-resources-plugin или maven-war-plugin , но я пока не нашел его.

4 голосов
/ 10 ноября 2011

Как сказал BalusC, вы должны сохранить файлы в формате utf-8.

Чтобы решить вашу дополнительную проблему с включенными файлами, просто включите заголовок

<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

вверху каждого включенного файла.Это говорит сервлету обрабатывать файл в кодировке UTF-8 вместо использования стандартного ISO-8859-1.

4 голосов
/ 04 января 2011

Вам необходимо настроить Eclipse для сохранения файлов в формате UTF-8.

Перейти к Окно> Настройки , ввести текст фильтра encoding сверху, изучить все разделы, чтобы установить вседо UTF-8.В частности, для файлов JSP это находится в Web> JSP Files> Encoding .Выберите самый верхний вариант UTF-8 (называется «ISO 10646 / Unicode (UTF-8)»).

Для файлов свойств это отдельная история.Согласно спецификации они будут по умолчанию считываться как ISO-8859-1.Для этого вам нужен либо инструмент native2ascii, либо пользовательский загрузчик файлов свойств, использующий UTF-8.Подробнее см. в этой статье .

2 голосов
/ 11 сентября 2012

Я использую Tomcat 7 с интегрированными средами Spring и использую <jsp:include page="anyFile.html"/> в JSP, и получаю java.lang.IllegalStateException.<jsp:include> работает нормально, если я хочу включить другой файл JSP вместо статического HTML-файла, но когда я пытаюсь внедрить статический HTML-файл, он продолжает давать мне это исключение в связи с кодировкой символов.

Использование <jsp:directive.include file="anyFile.html" /> или <%@include file="anyFile.html"%> работает, но все специальные символы ("é", "è", "ç" и т. Д.) Отображаются в кодировке ISO-8891 вместо UTF-8, даже если файл JSP имеет <%@page contentType="text/html" pageEncoding="UTF-8"%> и <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> в нем.

Я нашел решение, используя библиотеку тегов JSLT с тегом импорта:

  1. поместил это в JSP: <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

  2. Затем получите файл HTML, который я хочу включить, используя это: <c:import url="anyFile.html" charEncoding="UTF-8"/>

Имеется ли у вас тег import избиблиотека JSLT имеет атрибут charEncoding, который может установить для html-файла соответствующую кодировку символов и правильно отобразить его содержимое.

0 голосов
/ 04 января 2011

Для JSP см. @ BalusC.

Файлы свойств см .: http://download.oracle.com/javase/1.4.2/docs/api/java/util/Properties.html

При сохранении свойств в поток или загрузке их из потока, Используется кодировка ISO 8859-1. Для персонажей, которые не могут быть непосредственно представленные в этой кодировке, используются экранированные символы Юникода; однако в escape-последовательности допускается только один символ 'u'. Инструмент native2ascii может использоваться для преобразования файлов свойств в и из других кодировок символов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...