HttpServletRequest - setCharacterEncoding, кажется, ничего не делает - PullRequest
24 голосов
/ 19 июля 2010

Я пытаюсь прочитать информацию UTF-8 из запроса.Я использовал "request.setCharacterEncoding (" UTF-8 ");", но он, похоже, ничего не делает - чтение информации не UTF-8.

Что я делаю не так?

Ответы [ 8 ]

24 голосов
/ 19 июля 2010

Если вы используете tomcat, вам также следует установить URIEncoding в UTF-8 в ваших разъемах:

<Server port="8105" shutdown="SHUTDOWN">
...
    <Service name="Catalina">
        <Connector port="8180" URIEncoding="UTF-8" />
        <Engine name="Catalina" defaultHost="localhost">
            <Host name="localhost" appBase="webapps" />
        </Engine>
    </Service>
</Server>
19 голосов
/ 19 июля 2010

HttpServletRequest#setCharacterEncoding() имеет силу только тогда, когда запрос является POST запросом и тело запроса не обработано.

Так что, если это не сработает в вашем случае, тогда это может иметь две причины:

  1. На самом деле вы запускаете запрос GET. То есть параметры запроса передаются от клиента к серверу в URL-адресе запроса, а не в теле запроса. URL-адрес запроса обрабатывается веб-сервером, а не Servlet API. Итак, чтобы исправить это, вам нужно настроить соответствующий веб-сервер для декодирования URL-адреса запроса (URI) с использованием указанной кодировки символов. В случае, например, Apache Tomcat, вам нужно установить атрибут URIEncoding элемента <Connector> в server.xml на UTF-8.

  2. Вы правильно используете POST, но вы уже (косвенно) обработали тело запроса, так что уже слишком поздно менять кодировку символов. Тело запроса будет полностью обработано только при первом вызове метода getParameterXXX(). Есть несколько из них. Он не будет повторно обрабатываться при последующих вызовах. При определении того, кто вызывает этот метод, не забывайте принимать во внимание все объявленные Filter экземпляры в web.xml. Некоторые из них могут захватывать и сканировать параметры.

Если это по-прежнему ничего не помогает, то единственной возможной причиной остается то, что консоль дисплея или регистратор или все, что вы используете для печати / определения / отладки полученного параметра запроса, не поддерживает UTF-8. Вы бы хотели перенастроить консоль / регистратор / и т. Д. Для использования UTF-8 вместо отображения символов. Если это, например, консоль Eclipse, то вы можете установить ее с помощью Окно> Параметры> Общие> Рабочая область> Кодировка текстовых файлов .

Смотри также:

5 голосов
/ 19 июля 2010

этот метод действительно глупый. его не должно быть, и вы не должны его использовать.

для тела в запросе POST кодировка должна быть явно определена клиентом в заголовке Content-Type. если нет, то это плохой запрос. [1]

для URI запроса GET клиент не может указать кодировку, и сервер должен иметь неявную кодировку, и программист должен установить кодировку, но этот метод не существует в Servlet API!

однако у вашего контейнера сервлетов может быть запатентованный способ сделать это.

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

1: http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.7.1

Параметр "charset" используется с некоторыми типами носителей для определения набора символов (раздел 3.4) данных. Когда отправителем не предоставлен явный параметр charset, подтипы медиа типа «text» определяются как , чтобы иметь значение по умолчанию charset «ISO-8859-1» при получении через HTTP. Данные в наборах символов, отличных от «ISO-8859-1» или его подмножеств ДОЛЖНЫ , маркироваться соответствующим значением набора символов.

2 голосов
/ 13 мая 2014

Проблема зависит от того, какой сервер приложений используется. Лучшее описание, которое я нашел по этой ссылке .

На некоторых серверах приложений request.setCharacterEncoding(...) не действует, пока вы не установите кодировку приложения с помощью дескриптора. Наиболее сложными являются JBoss, Apache Tomcat, Glassfish. Лучше WebLogic, лучше Jetty (UTF-8 - настройка по умолчанию).

В моем случае я должен создать дескриптор glassfish-web.xml и поместить туда тег parameter-encoding. В моем случае для GlassFish:

<glassfish-web-app error-url="">
    <!-- request.setCharacterEncoding("UTF-8") not functioning without this setting-->
    <parameter-encoding default-charset="UTF-8" />
</glassfish-web-app>
1 голос
/ 19 июля 2010

Просто чтобы подтвердить, что для параметров POST вы должны вызвать request.setCharacterEncoding(...), прежде чем получить параметры. А для параметров GET это зависит от того, какой веб-контейнер вы используете (используйте ответ Мориса Перри для Tomcat).

Пожалуйста, проверьте эту ссылку для получения дополнительной информации. «Преобразование символов из браузера в базу данных» http://java.sun.com/developer/technicalArticles/Intl/HTTPCharset/

1 голос
/ 19 июля 2010

вы делаете это после любого вызова request.getParameter.

request.setCharacterEncoding("UTF-8") должен быть вызван до любого request.getParameter() вызова.

0 голосов
/ 11 сентября 2017

для jboss / wildfly есть запрос функции https://issues.jboss.org/browse/WFLY-2533

Перетащите это в WEB-INF / jboss-web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<jboss-web version="8.0" xmlns="http://www.jboss.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.jboss.org/j2ee/schema/jboss-web_8_0.xsd">
    <!-- browser tend to not send encoding information, so we have to match the servlet container's
    default encoding with our requested form data encoding: -->
    <default-encoding>UTF-8</default-encoding>
</jboss-web>
0 голосов
/ 09 июня 2012

(как для самого первого вопроса ..)
если вы читаете параметры из тела, также возможно прочитать каждый элемент с его собственной кодировкой (смотрите в последней строке):

ServletFileUpload upload = new ServletFileUpload(new DiskFileItemFactory());
List items = null;
try {
    items = upload.parseRequest(request);
} catch (FileUploadException ex) {
    logger.warn("Fail during file upload");
    return uploads;
}

Iterator itr = items.iterator();
while (itr.hasNext()) {
    FileItem item = (FileItem) itr.next();
    if (item.isFormField()) {
        String name = item.getFieldName();
        System.out.println("name: " + name);
        String value = item.getString();
        System.out.println("get as utf8 - "+item.getString("UTF-8"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...