Java обрабатывает параметры запроса специальных символов

Я работаю над приложением Flex-Java (клиент-сервер), и у меня возникла проблема. Я отправляю на сервер параметры пути и получаю их на JSP, иногда эти параметры имеют специальные символы, такие как áéíóú или ñ. У меня есть то, что я считаю распространенной проблемой, эти специальные символы неправильно принимаются на моем сервере.

Я также проверил другие вопросы, имеющие ту же проблему, что и this или это другое.

Я уже пытался использовать request.setCharacterEncoding("UTF-8") для получения параметров (ответ на первый вопрос).

Я также попытался проверить конфигурацию своего сервера (Apache Tomcat 7.0.34.0) в файле server.xml и уверен, что узел с портом 8080 имеет атрибут URIEncoding="UTF-8" (ответ на второй вопрос).

Я даже пытался прочитать параметр, например:

String paramTest1 = (new String(request.getParameter("paramTest").getBytes("ISO-8859-1"),"UTF-8")); or String paramTest2 = (new String(request.getParameter("paramTest").getBytes("UTF-8")));

Отлаживая свое приложение, я понял, что URI был хорошо принят, проблема в том моменте, когда я прочитал параметры из запроса.

Запрос сведений

В настоящее время я получаю параметры традиционным способом, код моего JSP:

<%@page contentType="text/html" pageEncoding="UTF-8" language = "java"%>
<%
request.setCharacterEncoding("UTF-8");
String paramTest = request.getParameter("paramTest");
String paramTest1 = (new String(request.getParameter("paramTest").getBytes("ISO-8859-1"),"UTF-8"));
String paramTest2 = (new String(request.getParameter("paramTest").getBytes("UTF-8")));
%>

Как видно из изображения, я отправляю строку «1234acentoáéíóúeñe» для параметра paramTest. Значения моих переменных, получающих параметры:

paramTest = 1234acento�����
paramTest1 = 1234acento?????
paramTest2 = 1234acento�����

И мне нужно получить точно такие же символы, которые я отправляю.

Не знаю, важно ли это сказать, но на стороне Flex для объекта URLRequest я указываю объект URLRequestHeader ("Content-Type", "text/html;charset=UTF-8") для массива requestHeaders. Это не помогает для моей цели.

Любой комментарий или ответ приветствуется.

Спасибо.


person Hugo Allexis Cardona    schedule 16.07.2013    source источник


Ответы (2)


Возможно, это слишком старая технология, но она может быть полезна для людей, которые до сих пор пишут код на as4 (flex).

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

Итак, когда запрос является fileRequest, параметры должны быть отправлены как параметры URI в параметре URLRequest FileReference, и поэтому параметры хорошо выглядят в URI, но не могут быть прочитаны на сервере.

Хорошо, хорошо, слишком много болтовни, поэтому код для кодирования символов в кавычках на стороне клиента:

public static function encodeQuotes(s:String):String {
    return s.replace("á", "%C3%A1").replace("é", "%C3%A9").replace("í", "%C3%AD").replace("ó", "%C3%B3").replace("ú", "%C3%BA").replace("ñ", "%C3%B1").
        replace("Á", "%C3%81").replace("É", "%C3%89").replace("Í", "%C3%8D").replace("Ó", "%C3%93").replace("Ú", "%C3%9A").replace("Ñ", "%C3%91");
}

Затем вы можете прочитать параметры на стороне сервера с тем же request.setCharacterEncoding("UTF-8");.

person Hugo Allexis Cardona    schedule 01.12.2014

Используйте getBytes () также с кодировкой utf-8 вместо iso-8859.

person Bimalesh Jha    schedule 16.07.2013
comment
Я забыл включить его в свой ответ, но я также пытался использовать String paramTest3 = (new String(request.getParameter("paramTest").getBytes("UTF-8")));, и это приводит к строке 1234acento����� для того же параметра. Спасибо за ответ. - person Hugo Allexis Cardona; 16.07.2013
comment
@HugoAllexisCardona вы должны использовать UTF-8 в обоих местах: например, new String(req.getParameter("paramTest").getBytes("UTF-8"),"UTF-8"); - person Bimalesh Jha; 16.07.2013
comment
Я пробовал, также результат для значения 1234acento����� для того же параметра. Любая другая рекомендация? - person Hugo Allexis Cardona; 16.07.2013
comment
где вы видите результат 1234acento????? Для отображения в браузере, например. Firefox установил правильную кодировку через Вид -> Кодировка символов -> UTF-8. - person Bimalesh Jha; 16.07.2013
comment
Я вижу результат в отладчике NetBeans, создавая выражение наблюдения для тех переменных, в которых хранится параметр. - person Hugo Allexis Cardona; 17.07.2013
comment
не уверен насчет netneans, но в Eclipse есть способ установить кодировку символов на utf-8, а не использовать кодировку ОС по умолчанию. В конечном счете, ваше приложение будет вызываться из браузера, поэтому рекомендуется протестировать его с помощью FireFox или IE с соответствующей кодировкой. - person Bimalesh Jha; 18.07.2013