Проблема кодирования символов 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