Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > doGet и русские символы


Автор: _Flint_ 13.2.2007, 14:43
У меня есть JavaScript код на странице:
Код

 xmlHttpRequest.open("GET", "ajaxservlet?tp="+type+"&fam="+encodeURIComponent(fio.value), true);


При передаче русских символов, в параметре fam содержится строка следующего вида: %D0%A8%D0%B0%D0%BC%D1%

Сервлет получает этот запрос и обрабатывает его следующим методом:

Код

    public void doGet(HttpServletRequest request, 
                      HttpServletResponse response) throws ServletException, 
                                                           IOException {
        String type = request.getParameter("tp");
        String fio =  request.getParameter("fam");
        boolean valid = true;
        if (type.equals("fam"))
            valid = fio.toUpperCase().equals("ПУПУПКИН");


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

Автор: tux 13.2.2007, 14:51
http://java.sun.com/j2se/1.5.0/docs/api/java/net/URLDecoder.html

Автор: _Flint_ 13.2.2007, 15:13
Пробую
Код

String fio =  URLDecoder.decode(request.getParameter("fam"));

и
Код

String fio =  URLDecoder.decode(request.getParameter("fam", "UTF-8"));

и
Код

String fio =  URLDecoder.decode(request.getParameter("fam", "windows-1251"));


Результат в переменной fio не меняется. Как был равен "Шамрей", так и остается

Автор: tux 13.2.2007, 15:16
А что за веб-контейнер?

Автор: _Flint_ 13.2.2007, 15:19
Если я правильно понял вопрос, то OC4J

Автор: tux 13.2.2007, 15:34
Так значит. Кодировка, в которой передаются параметры запроса, настраивается средствами веб-контейнеров. Как это делается в OC4J точно не скажу. Попробуй поискать файлик с именем orion-web.xml или похожим, относящийся к разворачиваемому приложению. К тэгу orion-web-app добавь атрибут default-charset с нужным названием кодировки. Правда на что это значение атрибута распространяется я не знаю, возможно и на кодировку, используемую в GET. В общем попробуй, если не получится, придется искать что-то другое.

Автор: _Flint_ 13.2.2007, 15:39
Самое забавное что конструкция
Код

        String ss = URLDecoder.decode(request.getQueryString(), "utf-8");
        System.out.println(ss);

В итоге показывает строку запроса с уже переведенным параметром "fam".
Однако конструкция
Код

String fio =  URLDecoder.decode(request.getParameter("fam"), "utf-8");

продолжает демонстрировать кракозябры.
Такое ощущение что придется парсить строку ss уже своими средствами а не getParameter, что не есть верное решение

Автор: _Flint_ 13.2.2007, 16:01
Помогла следующая конструкция:
Код

String fio =  new String(request.getParameter("fam").getBytes(), "utf-8");


Спасибо за помощь. Совет с URLDecoder навел на правильную мысль.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)