проблема кодирования в сервлете - PullRequest
3 голосов
/ 28 ноября 2010

У меня есть сервлет, который получает некоторый параметр от клиента, а затем выполняет некоторую работу.И параметр от клиента - китайский, поэтому я часто получаю некоторые недопустимые символы в сервете.Например: если я введу

http://localhost:8080/Servlet?q=中文&type=test

Тогда в сервлете параметр 'type' является правильным (test), однако параметр 'q' не корректно кодируется, они становятся недопустимыми символами, которые могутне проанализирован.

Однако, если я снова войду в панель adderss, URL изменится на:

http://localhost:8080/Servlet?q=%D6%D0%CE%C4&type=test

Теперь мой сервлет получит правильный параметр 'q'.

В чем проблема?

UPDATE

Кстати, это хорошо, когда я отправляю форму с почтой.Когда я отправляю их в ajax, например:

url="http://..q='中文',
xmlhttp.open("POST",url,true); 

Тогда на стороне сервера также появляются недопустимые символы.

Кажется, что только когда символы китайского языка кодируются как% xx, серверная сторона может получить правильный результат.

То есть http://.../q=中文 не работает, http://.../q=%D6%D0%CE%C4 работает.

Но почему "http://www.google.com.hk/search?hl=zh-CN&newwindow=1&safe=strict&q=%E4%B8%AD%E6%96%87&btnG=Google+%E6%90%9C%E7%B4%A2&aq=f&aqi=&aql=&oq=&gs_rfai=" работает? alt text

Ответы [ 4 ]

10 голосов
/ 28 ноября 2010

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

<%@ page pageEncoding="UTF-8" %>

Затем, чтобы обработать строку запроса GET как UTF-8, убедитесь, что рассматриваемый сервлет-контейнер настроен для этого.,Неясно, какой из них вы используете, поэтому вот пример Tomcat: установите атрибут URIEncoding элемента <Connector> в /conf/server.xml на UTF-8.

<Connector URIEncoding="UTF-8">

Для случая, когда вы хотите использовать POST, вам необходимо убедиться, что HttpServletRequest получил команду на анализ тела запроса POST с использованием UTF-8.

request.setCharacterEncoding("UTF-8");

Вызовите это до вы получаете доступ к первому параметру.Filter - лучшее место для этого.

См. Также:

1 голос
/ 28 ноября 2010

Использование не-ASCII символов в качестве параметров GET (т. Е. В URL) обычно проблематично.RFC 3986 рекомендует использовать UTF-8, а затем процентное кодирование, но это AFAIK не официальный стандарт.И то, что вы используете в случае, когда это работает , не UTF-8!

Возможно, было бы безопаснее переключиться на POST-запросы.

0 голосов
/ 28 ноября 2010

Прочтите эту статью в формате кодировки URL "www.blooberry.com/indexdot/html/topics/urlencoding.htm".

Если вы хотите, вы можете преобразовать символы в шестнадцатеричные или Base64 и поместить их в параметры URL.

Я думаю, что лучше поместить их в тело (Post), чем в URL (Get).

0 голосов
/ 28 ноября 2010

Я считаю, что проблема на отправляющей стороне.Как я понял из вашего описания, если вы пишете URL в браузере, вы получаете «правильно» закодированный запрос.Эта работа выполняется браузером: он знает, как преобразовать символы Юникода в последовательность кодов, таких как% xx.

Итак, попробуйте проверить, как вы отправляете запрос.Он должен быть закодирован при отправке.

Другая возможность - использовать метод POST вместо GET.

...