Проблема кодировки символов весной - PullRequest
13 голосов
/ 17 июня 2010

Я застрял в большой проблеме с кодировкой на моем сайте!Я использую Spring 3, Tomcat 6 и MySQL DB.Я хочу поддерживать немецкий и чешский языки наряду с английским на своем веб-сайте, я создал все JSP в виде файлов UTF-8, и в каждый jsp я включаю следующее:

<%@ page language="java" contentType="text/html; charset=UTF-8"
     pageEncoding="UTF-8"%>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

Я создал messages.properties (по умолчанию (чешский), messages_de.properties и messages_en.properties.И все они сохраняются в виде файлов UTF-8.

Я добавил следующее в web.xml:

<filter>
    <filter-name>encodingFilter</filter-name>
    <filterclass>
          org.springframework.web.filter.CharacterEncodingFilter</filterclass>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
        <param-name>forceEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
 </filter>

 <locale-encoding-mapping-list>
    <locale-encoding-mapping>
        <locale>en</locale>
        <encoding>UTF-8</encoding>
    </locale-encoding-mapping>
    <locale-encoding-mapping>
        <locale>cz</locale>
        <encoding>UTF-8</encoding>
    </locale-encoding-mapping>
    <locale-encoding-mapping>
        <locale>de</locale>
        <encoding>UTF-8</encoding>
    </locale-encoding-mapping>
</locale-encoding-mapping-list>

 <filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
 </filter-mapping>  

И добавил следующее в мой applicationContext.xml:

<bean id="messageSource"    
    class="org.springframework.context.support.ResourceBundleMessageSource"
    p:basenames="messages"/>

<!-- Declare the Interceptor -->
<mvc:interceptors>    
    <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"
          p:paramName="locale" />
</mvc:interceptors>

<!-- Declare the Resolver -->
<bean id="localeResolver"  
       class="org.springframework.web.servlet.i18n.SessionLocaleResolver" />

Я установил для атрибута useBodyEncodingForURI значение true в элементе server.xml в разделе:% CATALINA_HOME% / conf, также в другой раз попытался добавить вместо него URIEncoding = "UTF-8".

Я создалвсе таблицы и поля с набором символов [utf8] и коллекцией [utf8_general_ci]

Кодировка в моем браузере - UTF-8 (кстати, у меня IE8 и Firefox 3.6.3)

Когда яоткройте браузер MYSQL Query и вставьте вручную чешские или немецкие данные, они вставляются правильно, а также корректно отображаются в моем приложении.

Итак, вот список моих проблем:

  1. По умолчанию загружается messages.properties (чешский язык), вместо этого по умолчанию загружается messages_en.properties.

  2. В веб-форме при вводе чешских данных затемнажмите кнопку отправить, в контроллере я распечатаюданные в консоли перед тем, как сохранить их в дб, то, что печатается, неправильно с странными символами, и это точные данные, которые сохраняются в дб.

Я не знаю, гдеошибка!Почему я не могу заставить его работать, хотя я делал то, что делали люди, и работал на них!не знаю ..

Пожалуйста, помогите мне, я застрял в этой дерьмовой проблеме уже несколько дней, и она сводит меня с ума!

Заранее спасибо.

Ответы [ 3 ]

14 голосов
/ 24 июня 2010

Во-первых, если ваш проект использует Maven, убедитесь, что в плагине Maven Resources для UTF-8 задана схема кодировки символов , в противном случае файлы свойств сообщения могут быть записаны в вашу цель с неверной кодирование.

Во-вторых, вы используете ResourceBundleMessageSource , который использует стандартные java.util.ResourceBundle и java.util.Properties , которые поддерживают только ISO- Кодировка 8859-1. Вместо этого вы можете использовать ReloadableResourceBundleMessageSource , например:

<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
         <property name="basename" value="classpath:messages"/>
         <property name="defaultEncoding" value="UTF-8"/>
</bean>

, который я обнаружил из этого сообщения в блоге Cake Solutions.

3 голосов
/ 19 июля 2010

Если это по-прежнему не работает, и вы используете Tomcat в качестве сервера приложений, попробуйте установить следующую опцию для каждого элемента <Connector> в server.xml:

<Connector URIEncoding="UTF-8" ...>
    ...
</Connector>

Это помогло мне. Могут быть аналогичные параметры для других серверов приложений, поэтому вы можете проверить документацию к серверу.

2 голосов
/ 18 июня 2010

1: по умолчанию загружается messages.properties (чешский), вместо этого по умолчанию загружается messages_en.properties.

Я не делаю Spring, так что вот съемки в темноте: может быть, потому что сначала заказывается английский, и / или ваша платформа / браузер использует английский в качестве локали по умолчанию? Переставьте конфигурацию и отметьте accept-language в заголовке HTTP-запроса, чтобы исключить одно и другое.

2: В веб-форме, когда я ввожу данные на чешском языке, затем нажимаю «Отправить», в контроллере я распечатываю данные в консоли, прежде чем сохранить их в БД, то, что печатается, неправильно, имеет странные символы это точные данные, которые сохраняются в БД.

Настроена ли консоль для использования данных в формате UTF-8? В противном случае будет использоваться кодировка платформы по умолчанию. Например, в Eclipse вы можете настроить его с помощью Окно> Настройки> Общие> Рабочая область> Кодировка текстовых файлов .

Правильно ли настроен уровень доступа к данным для обработки данных в формате UTF-8? Известно, что в этом случае драйвер JDBC MySQL немного неумный. Он не будет использовать кодировку, указанную в БД, а кодировку по умолчанию для клиентской платформы. Кстати, вы хотите использовать свойства useUnicode=true и characterEncoding=UTF-8 в строке подключения JDBC. Э.Г.

jdbc:mysql://localhost/some_db?useUnicode=yes&characterEncoding=UTF-8
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...