Как получить UTF-8, работающий в веб-приложениях Java?

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

См. также: A хороший список лучших практик

Я бы добавил, очень важно, хорошо использовать модификатор final. Использование "окончательной" модификатор, когда это применимо в Java

Сводка:

  1. Используйте модификатор final для обеспечения хорошей инициализации.
  2. Избегайте возврата null в методы, например, при возврате пустых коллекций.
  3. Использовать аннотации @NotNull и @Nullable
  4. Быстрое завершение работы и использование утверждений, чтобы избежать распространения нулевых объектов через все приложение, когда они не должен быть пустым.
  5. Сначала используйте значения с известным объектом: if("knownObject".equals(unknownObject)
  6. Предпочитают valueOf() поверх toString ().
  7. Используйте null safe StringUtils StringUtils.isEmpty(null).

362
задан informatik01 20 March 2014 в 09:32
поделиться

6 ответов

Ответ на меня, поскольку FAQ этого сайта поощряет его. Это работает на меня:

äåà символов Mostly ¶ не являются проблематичным как набором символов по умолчанию, используемым браузерами, и кот/Java для веб-приложений является latin1 т.е. ISO-8859-1, который "понимает" те символы.

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

Tomcat Конфигурирования server.xml

необходимо настроить это, коннектор использует UTF-8 для кодирования URL (ПОЛУЧИТЕ запрос), параметры:

<Connector port="8080" maxHttpHeaderSize="8192"
 maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
 enableLookups="false" redirectPort="8443" acceptCount="100"
 connectionTimeout="20000" disableUploadTimeout="true" 
 compression="on" 
 compressionMinSize="128" 
 noCompressionUserAgents="gozilla, traviata" 
 compressableMimeType="text/html,text/xml,text/plain,text/css,text/ javascript,application/x-javascript,application/javascript"
 URIEncoding="UTF-8"
/>

ключевая роль, являющаяся URIEncoding = "UTF-8" в вышеупомянутом примере. Это гарантирует, что дескрипторы Tomcat все поступление ПОЛУЧАЮТ параметры как закодированный UTF-8. В результате, когда пользователь пишет следующее в строку поиска браузера:

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

символ Р ¶ обрабатывается как UTF-8 и кодируется к (обычно браузером перед ровным получением к серверу) как [1 128] %D0%B6.

запрос POST не затронуты этим.

CharsetFilter

Тогда пора вынудить веб-приложение Java обработать все запросы и ответы как закодированный 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/независимо от того, что. Альтернатива должна установить ответ, кодирующий и т.д. в каждом контроллере приложения.

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

 <!--CharsetFilter start--> 

  <filter>
    <filter-name>CharsetFilter</filter-name>
    <filter-class>fi.foo.filters.CharsetFilter</filter-class>
      <init-param>
        <param-name>requestEncoding</param-name>
        <param-value>UTF-8</param-value>
      </init-param>
  </filter>

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

инструкции для того, чтобы сделать этот фильтр найдены в кот Wiki ( http://wiki.apache.org/tomcat/Tomcat/UTF-8 )

страница JSP, кодирующая

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

<jsp-config>
    <jsp-property-group>
        <url-pattern>*.jsp</url-pattern>
        <page-encoding>UTF-8</page-encoding>
    </jsp-property-group>
</jsp-config>

, С другой стороны, все JSP-страницы веб-приложения должны были бы иметь следующее наверху их:

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

, Если некоторое расположение с различными JSP-фрагментами используется, то это необходимо в [1 130] весь из них.

метатеги HTML

кодирование страницы JSP говорит JVM обрабатывать символы на странице JSP в корректном кодировании. Тогда пора сказать браузер, в котором кодирование страницы HTML:

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

   <?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">
   <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fi">
   <head>
   <meta http-equiv='Content-Type' content='text/html; charset=UTF-8' />
   ...

соединение JDBC

При использовании дб, это должно быть определено, что соединение использует кодировку UTF-8. Это сделано в [1 131] context.xml или везде, где соединение JDBC определяется следующим образом:

      <Resource name="jdbc/AppDB" 
        auth="Container"
        type="javax.sql.DataSource"
        maxActive="20" maxIdle="10" maxWait="10000"
        username="foo"
        password="bar"
        driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/      ID_development?useEncoding=true&amp;characterEncoding=UTF-8"
    />

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

используемая база данных должна использовать кодировку 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 - файл и в Linux путем конфигурирования my.cnf - файл. В тех файлах это должно быть определено, что все клиенты, подключенные к серверу, используют utf8 в качестве набора символов по умолчанию и что набор символов по умолчанию, используемый сервером, также 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 ;

ПОЛУЧАЮТ запросы: latin1 и UTF-8

, Если и когда это определяется в server.xml кота, который ПОЛУЧАЕТ параметры запроса, кодируются в UTF-8, следующее ДОБИРАЮТСЯ, запросы обработаны правильно:

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

, поскольку символы ASCII кодируются таким же образом и с latin1 и с UTF-8, строка "Petteri" обрабатывается правильно.

символ кириллицы Р ¶ не понят вообще в latin1. Поскольку Tomcat проинструктирован для обработки параметров запроса как UTF-8, это кодирует тот символ правильно [1 135] %D0%B6.

, Если и когда браузеры проинструктированы, чтобы прочитать страницы в кодировке UTF-8 (с заголовками запроса и метатегом HTML), по крайней мере, Firefox 2/3 и другие браузеры с этого периода, все кодируют символ сами [1 136] %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 символ , Г¤ кодируется как [1 138] %E4. Даже при том, что page/request/everything определяется для использования UTF-8. Закодированная версия UTF-8 Г¤ %C3%A4

, которым результат этого состоит в том, что это довольно невозможно для веб-приложения к дескриптору correly, параметры запроса от ПОЛУЧАЮТ запросы, поскольку некоторые символы кодируются в latin1 и других в UTF-8. Уведомление: запросы POST действительно работают, поскольку браузеры кодируют все параметры запроса от форм полностью в UTF-8, если страница определяется как являющийся Материалом UTF-8

для чтения

А очень большое спасибо за писателей следующего для предоставления ответов для моей проблемы:

  • http://tagunov.tripod.com/i18n/i18n.html
  • http://wiki.apache.org/tomcat/Tomcat/UTF-8
  • http://java.sun.com/developer/technicalArticles/Intl/HTTPCharset/
  • http://dev.mysql.com/doc/refman/5.0/en/charset-syntax.html
  • http://cagan327.blogspot.com/2006/05/utf-8-encoding-fix-tomcat-jsp-etc.html
  • http://cagan327.blogspot.com/2006/05/utf-8-encoding-fix-for-mysql-tomcat.html
  • http://jeppesn.dk/utf-8.html
  • http://www.nabble.com/request-parameters-mishandle-utf-8-encoding-td18720039.html
  • http://www.utoronto.ca/webdocs/HTMLdocs/NewHTML/iso_table.html
  • http://www.utf8-chartable.de/

Важное примечание

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

Tomcat с Apache

Еще одна вещь при использовании Apache + Tomcat + mod_JK коннектор тогда Вы также должна сделать следующие изменения:

  1. Добавляют URIEncoding = "UTF-8" в кота файл server.xml для 8 009 коннекторов, это используется mod_JK коннектором. <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" URIEncoding="UTF-8"/>
  2. Goto Ваша апачская папка т.е. /etc/httpd/conf и добавляют AddDefaultCharset utf-8 в [1 121]. Примечание: Первая проверка, которая это, существует или нет. Если существуют, можно обновить его с этой строкой. Можно добавить эту строку в основе также.
546
ответ дан hev1 23 November 2019 в 00:11
поделиться

Я думаю, что Вы подвели итог его вполне хорошо в Вашем собственном ответе.

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

13
ответ дан stian 23 November 2019 в 00:11
поделиться

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

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

<connection-url>jdbc:mysql://192.168.10.123:3308/mydatabase</connection-url>
<driver-class>com.mysql.jdbc.Driver</driver-class>
<user-name>nts</user-name>
<password>xaxaxa!</password>
<connection-property name="useUnicode">true</connection-property>
<connection-property name="characterEncoding">greek</connection-property>

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

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

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

1
ответ дан 23 November 2019 в 00:11
поделиться

In case you have specified in connection pool (mysql-ds.xml), in your Java code you can open the connection as follows:

DriverManager.registerDriver(new com.mysql.jdbc.Driver());
Connection conn = DriverManager.getConnection(
    "jdbc:mysql://192.168.1.12:3308/mydb?characterEncoding=greek",
    "Myuser", "mypass");
-1
ответ дан 23 November 2019 в 00:11
поделиться

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

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

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

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

  3. вышеуказанное свойство по умолчанию будет false, измените его на TRUE.
  4. перезапустите браузер.

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

1
ответ дан 23 November 2019 в 00:11
поделиться

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

runtime.encoding=<encoding>
2
ответ дан 23 November 2019 в 00:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: