Фильтр Charset, вызывающий проблему при разборе символов UTF-8 - PullRequest
4 голосов
/ 10 ноября 2011

Я использую фильтр кодировки Spring MVC.Это URL, который я использую для вызова моего сервлета из моего апплета

http://192.168.0.67/MyServlet?p1=団

Как видите, параметр имеет символ Unicode 団,Поэтому я использую

URLEncoder.encode("団", "UTF-8"); 

, и теперь мой URL становится

http://192.168.0.67/MyServlet?p1=%E5%9B%A3

Однако из сервлета вызывается

request.getParameter("p1"); 

уже возвращает некоторую тарабарщину, которую нельзя расшифровать с помощью URLDecoder.Кстати, вызов

URLDecoder.decode("%E5%9B%A3", "UTF-8"); 

действительно дает мне оригинальный символ Юникода.Просто сервлет исказил параметр еще до того, как его можно было декодировать.Кто-нибудь знает почему?request.getParameter() не декодирует параметр с UTF-8?

1 Ответ

6 голосов
/ 10 ноября 2011

Фильтр charset Spring MVC устанавливает только кодировку тела запроса, а не кодировку URI запроса. Вам необходимо установить кодировку для кодировки URI в конфигурации servletcontainer. Многие сервлетконтейнеры по умолчанию используют ISO-8859-1 для декодирования URI. Непонятно, какой сервлетконтейнер вы используете, поэтому вот только пример для Tomcat: отредактируйте запись <Connector> в /conf/server.xml, добавив URIEncoding="UTF-8":

<Connector ... URIEncoding="UTF-8">

Если по какой-то причине вы не можете редактировать конфигурацию сервера (например, сторонний хостинг и т. Д.), Вам следует рассмотреть возможность использования POST вместо GET:

String query = "p1=" + URLEncoder.encode("団", "UTF-8");
URLConnection connection = new URL(getCodeBase(), "MyServlet").openConnection();
connection.setDoOutput(true); // This sets request method to POST.
connection.getOutputStream().write(query.getBytes("UTF-8"));
// ...

Таким образом, вы можете в doPost() использовать ServletRequest#setCharacterEncoding(), чтобы сообщить сервлетному API, какой набор символов использовать для анализа тела запроса (или просто полагаться на фильтр набора символов Spring MVC при выполнении этой работы) :

request.setCharacterEncoding("UTF-8");
String p1 = request.getParameter("p1"); // You don't need to decode yourself!
// ...

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

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