response.sendredirect с URL с иностранными символами - как кодировать? - PullRequest
1 голос
/ 21 апреля 2011

У меня есть приложение jsf, в котором есть международные пользователи, поэтому входные данные формы могут иметь незападные строки, такие как kanjii и Chinese - если я нажму на мой URL с помощью ..? Q = 東 日本 大, вывод на странице правильный, и я вижуq ввод в мою форму заполняется нормально.Но если я ввожу эту же строку в форму и отправляю, мое приложение выполняет перенаправление обратно на себя после создания URL-адреса с заполненными параметрами в URL-адресе (кажется избыточным, но это связано с интеграцией сторонних производителей), но перенаправление не кодируетстрока правильно.У меня есть

url = new String(url.getBytes("ISO-8859-1"), "UTF-8");
response.sendRedirect(url);

Но переадресация URL заканчивается q = ????Я поиграл с различными строками кодирования (переключился на ISO и UTF-8 и только что получил кучу толкований в URL) в конструкторе String, но, похоже, ни одна из них не сработала там, где я получил q = 東 日本 大. Есть идеи о том, чтоМне нужно сделать, чтобы правильно заполнить q = 東 pop 大 в редиректе?Спасибо.

Ответы [ 2 ]

0 голосов
/ 23 апреля 2011

Как дела? url?URI не могут напрямую содержать не-ASCII символы;они должны быть превращены в байты (используя определенную кодировку), а затем кодированы%.

URLEncoder.encode должен быть задан аргумент кодирования, чтобы обеспечить правильное кодирование.В противном случае вы получите кодировку по умолчанию, что, вероятно, неверно и всегда следует избегать.

String q= "\u6771\u65e5\u672c\u5927"; // 東日本大

String url= "http://example.com/query?q="+URLEncoder.encode(q, "utf-8");
// http://example.com/query?q=%E6%9D%B1%E6%97%A5%E6%9C%AC%E5%A4%A7

response.sendRedirect(url);

Этот URI будет отображаться как IRI 'http://example.com/query?q=東日本大’ в адресной строке браузера.

Makeуверен, что вы обслуживаете свои страницы как UTF-8 (используя заголовок / мета-тип содержимого) и интерпретируете ввод строки запроса как UTF-8 (для сервера; см. этот faq для Tomcat.)

0 голосов
/ 21 апреля 2011

Попробуйте

response.setContentType("text/html; charset=UTF-16");
response.setCharacterEncoding("utf-16");
...