Перейти к основному содержимому

Готовим Tomcat к UTF-8

· 3 мин. чтения

1. Введение

UTF-8 — наиболее распространенная кодировка символов, используемая в веб-приложениях. Он поддерживает все языки, на которых в настоящее время говорят в мире, включая китайский, корейский и японский.

В этой статье мы демонстрируем всю конфигурацию, необходимую для обеспечения UTF-8 в Tomcat.

2. Конфигурация разъема

Соединитель прослушивает соединения на определенном порту. Нам нужно убедиться, что все наши соединители используют UTF-8 для кодирования запросов.

Давайте добавим параметр URIEncoding="UTF-8" ко всем коннекторам в TOMCAT_ROOT/conf/server.xml :

<Connector 
URIEncoding="UTF-8"
port="8080"
redirectPort="8443"
connectionTimeout="20000"
protocol="HTTP/1.1"/>

<Connector
URIEncoding="UTF-8"
port="8009"
redirectPort="8443"
protocol="AJP/1.3"/>

3. Фильтр набора символов

После настройки соединителя пришло время заставить веб-приложение обрабатывать все запросы и ответы в кодировке UTF-8.

Давайте определим класс с именем CharacterSetFilter :

public class CharacterSetFilter implements Filter {

// ...

public void doFilter(
ServletRequest request,
ServletResponse response,
FilterChain next) throws IOException, ServletException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=UTF-8");
response.setCharacterEncoding("UTF-8");
next.doFilter(request, response);
}

// ...
}

Нам нужно добавить фильтр в файл web.xml нашего приложения, чтобы он применялся ко всем запросам и ответам:

<filter>
<filter-name>CharacterSetFilter</filter-name>
<filter-class>com.foreach.CharacterSetFilter</filter-class>
</filter>

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

4. Кодировка страницы сервера

Другая часть нашего веб-приложения, которую нам нужно настроить, — это страницы сервера Java.

Лучший способ обеспечить использование UTF-8 на страницах сервера — добавить этот тег вверху каждой страницы JSP:

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

5. Кодировка HTML-страницы

В то время как кодировка страницы сервера сообщает JVM, как обрабатывать символы страницы, кодировка страницы HTML сообщает браузеру, как обрабатывать символы страницы.

Мы должны добавить этот тег <meta> в раздел head всех HTML-страниц:

<meta http-equiv='Content-Type' content='text/html; charset=UTF-8' />

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

Теперь, когда наш Tomcat настроен, пришло время настроить базу данных.

Мы предполагаем, что используется сервер MySQL. Файл конфигурации называется my.ini в Windows и my.cnf в Linux.

Нам нужно найти файл конфигурации, найти эти параметры и отредактировать их соответствующим образом:

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

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

7. Конфигурация базы данных MySQL

Конфигурация набора символов сервера MySQL применяется только к новым базам данных. Нам нужно перенести старые вручную. Этого легко добиться с помощью нескольких команд.

Для каждой базы данных:

ALTER DATABASE database_name CHARACTER SET = utf8mb4 
COLLATE = utf8mb4_unicode_ci;

Для каждой таблицы:

ALTER TABLE table_name CONVERT TO 
CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Для каждого столбца VARCHAR или TEXT :

ALTER TABLE table_name CHANGE column_name column_name 
VARCHAR(69) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

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

Для соединения на основе JDBC это может быть достигнуто с помощью следующего URL-адреса соединения:

jdbc:mysql://localhost:3306/?useUnicode=yes;characterEncoding=UTF-8

8. Заключение

В этой статье мы продемонстрировали, как убедиться, что Tomcat использует кодировку UTF-8.