Подтвердить что ты не робот

HttpServletRequest - setCharacterEncoding, кажется, ничего не делает

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

Что я делаю неправильно?

4b9b3361

Ответ 1

Если вы используете 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>

Ответ 2

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

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

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

См. также:

Ответ 3

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

для тела в запросе 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" имеют , для которых значение по умолчанию имеет значение "ISO-8859-1" по умолчанию, если оно получено через HTTP. Данные в наборах символов, отличных от "ISO-8859-1" или его подмножеств MUST, будут помечены соответствующим значением кодировки.

Ответ 4

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

В некоторых серверах приложений 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>

Ответ 5

Вы делаете это после вызова request.getParameter.

request.setCharacterEncoding( "UTF-8" ) необходимо вызвать до вызова request.getParameter().

Ответ 6

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

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

Ответ 7

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

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"));

Ответ 8

для 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>