Как заставить UTF-8 работать в Java Webapps?

Мне нужно, чтобы UTF-8 работал в моем Java webapp (servlets + JSP, без использования фреймворка) для поддержки äöå и т. Д. Для обычного финского текста и кириллических алфавитов, таких как ЦжФ для особых случаев.

Моя настройка такова:

  • Среда разработки: Windows XP
  • Производственная среда: Debian

Используемая firebase database: MySQL 5.x

В основном пользователи используют Firefox2, но для доступа к сайту используются Opera 9.x, FF3, IE7 и Google Chrome.

Как достичь этого?

13 Solutions collect form web for “Как заставить UTF-8 работать в Java Webapps?”

Отвечая на вопрос, как часто задаваемые вопросы этого сайта поощряют его. Это работает для меня:

В основном символы äåö не являются проблематичными, поскольку набор символов по умолчанию, используемый браузерами, и tomcat / java для webapps – latin1, т.е. ISO-8859-1, который «понимает» этих символов.

Чтобы получить UTF-8, работающий под Java + Tomcat + Linux / Windows + Mysql, требуется следующее:

Настройка сервера server.xml Tomcat

Необходимо настроить, чтобы соединитель использовал UTF-8 для кодирования параметров URL-адреса (GET-запроса):

  

Ключевой частью является URIEncoding = «UTF-8» в приведенном выше примере. Это гарантирует, что Tomcat обрабатывает все входящие параметры GET как кодированные UTF-8. В результате, когда пользователь записывает следующее в адресную строку браузера:

  https://localhost:8443/ID/Users?action=search&name=*ж* 

символ ж обрабатывается как UTF-8 и кодируется (как правило, браузером, даже добравшись до сервера), как % D0% B6 .

Запрос POST не влияет на это.

CharsetFilter

Затем пришло время заставить java webapp обрабатывать все запросы и ответы как кодированные UTF-8. Это требует, чтобы мы определили фильтр набора символов следующим образом:

 package fi.foo.filters; import javax.servlet.*; import java.io.IOException; public class CharsetFilter implements Filter { private String encoding; public void init(FilterConfig config) throws ServletException { encoding = config.getInitParameter("requestEncoding"); if (encoding == null) encoding = "UTF-8"; } public void doFilter(ServletRequest request, ServletResponse response, FilterChain next) throws IOException, ServletException { // Respect the client-specified character encoding // (see HTTP specification section 3.4.1) if (null == request.getCharacterEncoding()) { request.setCharacterEncoding(encoding); } // Set the default response content type and encoding response.setContentType("text/html; charset=UTF-8"); response.setCharacterEncoding("UTF-8"); next.doFilter(request, response); } public void destroy() { } } 

Этот фильтр гарантирует, что если браузер не установил кодировку, используемую в запросе, она настроена на UTF-8.

Другая вещь, сделанная этим фильтром, – установить кодировку ответа по умолчанию, т.е. кодирование, в котором возвращен html / whatever. Альтернативой является установка кодировки ответа и т. Д. В каждом controllerе приложения.

Этот фильтр должен быть добавлен в web.xml или дескриптор развертывания webapp:

    CharsetFilter fi.foo.filters.CharsetFilter  requestEncoding UTF-8    CharsetFilter /*  

Инструкции для создания этого фильтра находятся в wiki tomcat ( http://wiki.apache.org/tomcat/Tomcat/UTF-8 )

Кодирование страницы JSP

В вашем web.xml добавьте следующее:

   *.jsp UTF-8   

В качестве альтернативы, все JSP-страницы веб-приложения должны иметь следующее:

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

Если используется какой-то макет с различными JSP-fragmentами, то это необходимо во всех них.

HTML-метаtags

Кодировка страницы JSP сообщает JVM обрабатывать символы на странице JSP в правильной кодировке. Затем пришло время сообщить браузеру, в котором кодировка html-страницы:

Это делается следующим образом в верхней части каждой xhtml-страницы, созданной webapp:

  < ?xml version="1.0" encoding="UTF-8"?> < !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">    ... 

JDBC-соединение

При использовании db необходимо определить, что соединение использует кодировку UTF-8. Это делается в контексте.xml или везде, где соединение JDBC определяется следующим образом:

   

База данных MySQL и таблицы

Используемая firebase database должна использовать кодировку UTF-8. Это достигается путем создания базы данных со следующим:

  CREATE DATABASE `ID_development` /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_swedish_ci */; 

Затем все таблицы должны быть в UTF-8:

  CREATE TABLE `Users` ( `id` int(10) unsigned NOT NULL auto_increment, `name` varchar(30) collate utf8_swedish_ci default NULL PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_swedish_ci ROW_FORMAT=DYNAMIC; 

Ключевой частью является CHARSET = utf8 .

Конфигурация сервера MySQL

Также необходимо настроить MySQL serveri. Обычно это делается в Windows путем изменения my.ini -file и в Linux путем настройки my.cnf-файла . В этих файлах должно быть определено, что все клиенты, подключенные к серверу, используют utf8 в качестве набора символов по умолчанию и что кодировка по умолчанию, используемая сервером, также является utf8.

  [client] port=3306 default-character-set=utf8 [mysql] default-character-set=utf8 по  [client] port=3306 default-character-set=utf8 [mysql] default-character-set=utf8 

Процедуры и функции Mysql

Они также должны иметь определенный набор символов. Например:

  DELIMITER $$ DROP FUNCTION IF EXISTS `pathToNode` $$ CREATE FUNCTION `pathToNode` (ryhma_id INT) RETURNS TEXT CHARACTER SET utf8 READS SQL DATA BEGIN DECLARE path VARCHAR(255) CHARACTER SET utf8; SET path = NULL; ... RETURN path; END $$ DELIMITER ; 

Запросы GET: latin1 и UTF-8

Если и когда в файле server.xml Tomcat определено, что параметры запроса GET закодированы в UTF-8, обрабатываются следующие запросы GET:

  https://localhost:8443/ID/Users?action=search&name=Petteri https://localhost:8443/ID/Users?action=search&name=ж 

Поскольку символы ASCII кодируются одинаково с латинскими и UTF-8, строка «Petteri» обрабатывается правильно.

Кириллический символ ж совсем не понимается на латинском языке1. Поскольку Tomcat получил указание обрабатывать параметры запроса как UTF-8, он правильно кодирует этот символ как % D0% B6 .

Если и когда браузеру рекомендуется читать страницы в кодировке UTF-8 (с заголовками запросов и метатегами html), по крайней мере Firefox 2/3 и другие браузеры с этого периода кодируют сам символ как % D0% B6 .

Конечным результатом является поиск всех пользователей с именем «Petteri», а также всех пользователей с именем «ж».

Но как насчет ååö?

HTTP-спецификация определяет, что по умолчанию URL-адреса кодируются как latin1. Это приводит к тому, что firefox2, firefox3 и т. Д. Кодируют следующие

  https://localhost:8443/ID/Users?action=search&name=*Päivi* 

в кодированную версию

  https://localhost:8443/ID/Users?action=search&name=*P%E4ivi* 

В latin1 символ ä кодируется как % E4 . Несмотря на то, что страница / запрос / все определено для использования UTF-8 . Закодированная версия UTF-8 – это % C3% A4

Результатом этого является то, что webapp не может корректно обрабатывать параметры запроса из запросов GET, поскольку некоторые символы кодируются в latin1 и другие в UTF-8. Примечание. Запросы POST работают, поскольку браузеры кодируют все параметры запроса из форм полностью в UTF-8, если страница определена как UTF-8

Материал для чтения

Очень большое спасибо за авторов следующих за ответы на мои проблемы:

Важная заметка

mysql поддерживает базовую многоязычную плоскость с использованием 3-байтовых символов UTF-8. Если вам нужно выйти за пределы этого (для некоторых алфавитов требуется более 3 байтов UTF-8), вам нужно либо использовать аромат типа столбца VARBINARY либо использовать utf8mb4 символов utf8mb4 (для которого требуется MySQL 5.5.3 или новее ). Просто имейте в виду, что использование utf8 символов utf8 в MySQL не будет работать в 100% случаев.

Tomcat с Apache

Еще одна вещь. Если вы используете соединитель Apache + Tomcat + mod_JK, вам также необходимо выполнить следующие изменения:

  1. Добавьте URIEncoding = “UTF-8” в файл tomcat server.xml для коннектора 8009, он используется коннектором mod_JK.
  2. Перейдите в папку apache, т.е. /etc/httpd/conf и добавьте AddDefaultCharset utf-8 в httpd.conf file . Примечание. Сначала проверьте, существует или нет. Если существует, вы можете обновить его с помощью этой строки. Вы также можете добавить эту строку внизу.

Я думаю, вы подытожили его в своем собственном ответе.

В процессе UTF-8-ing (?) Из конца в конец вы также можете убедиться, что сам java использует UTF-8. Использовать -Dfile.encoding = utf-8 в качестве параметра для JVM (можно настроить в catalina.bat).

Чтобы добавить к ответу kosoant , если вы используете Spring, вместо того, чтобы писать собственный фильтр Servlet, вы можете использовать class org.springframework.web.filter.CharacterEncodingFilter они предоставляют, настраивая его следующим образом в вашем web.xml:

   encoding-filter org.springframework.web.filter.CharacterEncodingFilter  encoding UTF-8   forceEncoding FALSE    encoding-filter /*  

Это для греческого кодирования в таблицах MySql, когда мы хотим получить к ним доступ с помощью Java:

Используйте следующую настройку соединения в пуле соединений JBoss (mysql-ds.xml)

 jdbc:mysql://192.168.10.123:3308/mydatabase com.mysql.jdbc.Driver nts xaxaxa! true greek 

Если вы не хотите помещать это в пул соединений JNDI, вы можете настроить его как JDBC-url, как на следующей строке:

 jdbc:mysql://192.168.10.123:3308/mydatabase?characterEncoding=greek 

Для меня и Ника, поэтому мы никогда не забываем об этом и тратим время больше …..

Хороший подробный ответ. просто хотел добавить еще одну вещь, которая определенно поможет другим увидеть кодировку UTF-8 в URL-адресах в действии.

Выполните следующие шаги, чтобы включить кодировку UTF-8 в URL-адресах в firefox.

  1. введите «about: config» в адресной строке.

  2. Используйте тип ввода фильтра для поиска свойства «network.standard-url.encode-query-utf8».

  3. указанное выше свойство будет ложным по умолчанию, поверните его в значение ИСТИНА.
  4. перезапустите браузер.

Кодировка UTF-8 по URL-адресам работает по умолчанию в IE6 / 7/8 и хром.

Я хочу также добавить отсюда эту часть, решающую мою проблему с utf:

 runtime.encoding= 

У меня есть аналогичная проблема, но в файлах файла я сжимаю apache. Итак, я решил это с помощью этой команды:

 convmv --notest -f cp1252 -t utf8 * -r 

он работает очень хорошо для меня. Надеюсь, это поможет кому угодно;)

Для моего случая отображения символа Unicode из пакетов сообщений мне не нужно применять раздел «JSP-страница» для отображения Unicode на моей странице jsp. Все, что мне нужно, это раздел «CharsetFilter».

Еще один момент, о котором не упоминалось, относится к Java Servlets, работающему с Ajax. У меня есть ситуации, когда веб-страница собирает текст utf-8 от пользователя, отправляющего его в файл JavaScript, который включает его в URI, отправленный на Servlet. Servlet запрашивает базу данных, захватывает результат и возвращает его как XML в файл JavaScript, который его форматирует и вставляет отформатированный ответ на исходную веб-страницу.

В одном веб-приложении я следил за инструкциями по ранней книге Ajax для того, чтобы обернуть JavaScript при построении URI. В примере в книге использовался метод escape (), который я обнаружил (трудный путь) неправильно. Для utf-8 вы должны использовать encodeURIComponent ().

Немногие люди, похоже, катят свой Ajax в эти дни, но я думал, что могу добавить это.

О CharsetFilter упоминается в @kosoant ответе ….

Существует встроенный Filter в tomcat web.xml (расположенный в conf/web.xml ). Фильтр называется setCharacterEncodingFilter и по умолчанию комментируется. Вы можете раскомментировать это (не забудьте также раскомментировать его filter-mapping )

Также нет необходимости устанавливать jsp-config в ваш web.xml (у меня есть тест для Tomcat 7+)

Некоторое время вы можете решить проблему через мастер администратора MySQL. В

Переменные запуска> Дополнительно>

и установите Def. char Set: utf8

Возможно, этот config необходимо перезапустить MySQL.

Предыдущие ответы не работали с моей проблемой. Это было только в производстве, с tomcat и apache mod_proxy_ajp. Сообщение тела потеряли не ascii символы? Проблема, наконец, заключалась в JVM defaultCharset (US-ASCII в установке по умолчанию: Charset dfset = Charset.defaultCharset ();), поэтому решением был запущен сервер tomcat с модификатором для запуска JVM с UTF-8 в качестве кодировки по умолчанию:

 JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=UTF-8" 

(добавьте эту строку в catalina.sh и перезапустите службу tomcat)

Возможно, вы также должны изменить системную переменную linux (edit ~ / .bashrc и ~ / .profile для постоянных изменений, см. https://perlgeek.de/en/article/set-up-a-clean-utf8-environment )

экспорт LC_ALL = en_US.UTF-8
export LANG = en_US.UTF-8

export LANGUAGE = ru_US.UTF-8

Если вы указали в пуле соединений (mysql-ds.xml), в своем Java-коде вы можете открыть соединение следующим образом:

 DriverManager.registerDriver(new com.mysql.jdbc.Driver()); Connection conn = DriverManager.getConnection( "jdbc:mysql://192.168.1.12:3308/mydb?characterEncoding=greek", "Myuser", "mypass"); 
  • Значок байтового байта закручивает чтение файлов в Java
  • Как изменить тип кодировки по умолчанию, используемый Thunderbird при создании нового электронного письма?
  • UTF-8: Общие? Бен? Unicode?
  • Как импортировать (и правильно просматривать) Китайский файл CSV с кодировкой UTF-8 с Excel 2011 на Mac OS X
  • Изменение ANSI по умолчанию в UTF-8 в Блокноте
  • В чем разница между UTF-8 и UTF-8 без спецификации?
  • Использование PowerShell для записи файла в UTF-8 без спецификации
  • Можно ли принудительно Excel распознавать файлы CSV UTF-8 автоматически?
  • Как заставить MySQL правильно обрабатывать UTF-8
  • «Неверное строковое значение» при попытке вставить UTF-8 в MySQL через JDBC?
  • Как я могу использовать UTF-8 в Linux из Windows 7 через PuTTY?
  • Tmux: пытается связать ключ utf8
  • Давайте будем гением компьютера.