Проблема кодирования символов spring

Я застрял в большой проблеме с кодировкой на моем сайте! Я использую 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".

Я создал все таблицы и поля с помощью charset [utf8] и коллекции [utf8_general_ci]

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

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

Итак, вот список проблем, которые у меня есть:

  • По умолчанию загружаются сообщения .properties(чешский), а по умолчанию загружаются сообщения_ru.properties.

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

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

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

Спасибо заранее.

Ответы

Ответ 1

Во-первых, если ваш проект использует Maven, убедитесь, что Maven Resources Plugin имеет 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.

Ответ 2

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

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

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

Ответ 3

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

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

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

Консоль настроена на использование UTF-8 для отображения данных? В противном случае он использовал бы кодировку по умолчанию для платформы. Например, в Eclipse вы можете настроить его с помощью Window > Preferences > General > Workspace > Text File Encoding.

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

jdbc:mysql://localhost/some_db?useUnicode=yes&characterEncoding=UTF-8