Знает ли сервлет кодировку отправленной формы, указанную с использованием http-эквивалент? - PullRequest
4 голосов
/ 19 мая 2010

Знает ли сервлет кодировку отправленной формы, указанную с использованием http-эквивалент?

Когда я указываю кодировку формы POST, используя http-эквивалент, вот так:

<HTML>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=gb2312'/>
</head>
<BODY >
<form name="form" method="post" >
    <input type="text" name="v_rcvname" value="相宜本草">
</form>
</BODY>
</HTML>

А затем в сервлете я использую метод, request.getCharacterEncoding() Я получил null! Итак, есть ли способ, которым я могу сказать серверу, что я кодирую данные в некоторой кодировке символов?

Ответы [ 2 ]

6 голосов
/ 19 мая 2010

Это действительно вернет null от большинства веб-браузеров. Но обычно вы можете смело предположить, что веб-браузер на самом деле использовал кодировку, как указано в исходном заголовке ответа, который в данном случае gb2312. Обычный подход заключается в создании Filter, который проверяет кодировку запроса, а затем использует ServletRequest#setCharacterEncoding() для принудительного задания желаемого значения (которое вы, конечно, должны последовательно использовать в своем веб-приложении).

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
    if (request.getCharacterEncoding() == null) {
        request.setCharacterEncoding("gb2312");
    }
    chain.doFilter(request, response);
}

Сопоставьте это Filter с url-pattern, охватывающим все запросы сервлета, например, /*.

Если вы этого не сделали и не отпустили, то сервлет-контейнер будет использовать свою кодировку по умолчанию для анализа параметров, обычно это ISO-8859-1, что, в свою очередь, неверно. Ваш ввод 相宜本草 будет выглядеть как ÏàÒ˱¾²Ý.

1 голос
/ 19 мая 2010

Невозможно отправить данные POST обратно в GB2312. Я думаю, что UTF-8 является рекомендацией W3C, и все новые браузеры отправляют данные только в формате Latin-1 или UTF-8.

Мы смогли вернуть данные в кодировке GB2312 в старом IE на Win 95, но, как правило, в новых браузерах на основе Unicode это невозможно.

См. Этот тест на Firefox,

POST / HTTP/1.1
Host: localhost:1234
User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 46

Моя страница находится в GB2312, и я везде указывал GB2312, но Firefox просто игнорирует его.

Некоторые неработающие браузеры даже кодируют китайский на латинице-1. Недавно мы добавили скрытое поле с известным значением. Проверяя значение, мы можем выяснить кодировку.

request.getCharacterEncoding () возвращает кодировку из Content-Type. Как видно из моего следа, он всегда равен нулю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...