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


Автор: garbuz 4.8.2008, 22:07
Знаю, сейчас будут пинать ногами, ибо тем про кодировки аж 2 страницы форума. Но вот в таком-то изобилии как раз и сложнее разобраться. Скажу честно, смотрел не все, но везде где смотрел ответа не нашел.
Ситуация такая: Есть jsp-страница (utf-8), у которой есть текстовое поле для ввода. Ввожу туда букву(русскую), сразу же делаю через javascript алерт с этой буквой. Все нормально. Далее через ajax (GET'ом) передаю эту букву на сервер. В сервлете через request получаю эту букву, только там уже не русская буква, а какая-то загагулина. Так вот. Как получить нормальную букву?
Пробовал несколько способов.
1) в самом начале писал
Код

req.setCharacterEncoding("utf-8");


2) Написал фильтр.
Код

public class CharsetFilter implements Filter {
    private String encoding;

    public void init(FilterConfig config) throws ServletException {
        
        encoding = config.getInitParameter("requestEncoding");

        
        if (encoding == null) encoding = "utf-8";
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain next)
            throws IOException, ServletException {
        request.setCharacterEncoding(encoding);
        next.doFilter(request, response);
    }

    public void destroy() {
    }




Код

<filter>
        <filter-name>Charset Filter</filter-name>
        <filter-class>combobox.web.CharsetFilter</filter-class>
          <init-param>
            <param-name>requestEncoding</param-name>
            <param-value>utf-8</param-value>
          </init-param>
      </filter>

      <filter-mapping>
        <filter-name>Charset Filter</filter-name>
        <url-pattern>/*</url-pattern>
      </filter-mapping>


3) Встретил еще такой вариант
Код

str = new String(str.getBytes("ISO-8859-1"), "Cp1251");


Так вот ничто не помогло, все равно загагулина получается.
Кстати, потом появится необходимость тянуть нек. данные из базы, данные в базе находятся в 1251. Проблемы будут если необходимый символ в utf-8? Может лучше на JSP странице и в фильтре (если бы он работал smile) выставить 1251? 
Короче вот такая вот проблема. smile 

Автор: tux 4.8.2008, 23:29
По пунктам.

1. В принципе неправильно. Кодировка запроса должна быть выставлена до первого обращения к запросу. Нет гарантии, что какой-либо фильтр не поработал с запросом до выполнения сервлета.
2. Маппинг этого фильтра стоит первым в списке маппингов в web.xml? Если нет, поставь на первое место.
3. Забудь про такие способы получения кириллических символов. Java и серверы приложений умеют работать с кодировками и без таких извращений.

Установка кодировки запроса сработает только для метода POST. Если у тебя метод GET,  скорее всего придется конфигурировать веь-контейнер.

Цитата(garbuz @  4.8.2008,  11:07 Найти цитируемый пост)
Кстати, потом появится необходимость тянуть нек. данные из базы, данные в базе находятся в 1251. Проблемы будут если необходимый символ в utf-8? Может лучше на JSP странице и в фильтре (если бы он работал smile) выставить 1251? 

Все денные внутри JVM хранятся в UNICODE, не важно какая кодировка у базы или на HTTP-странице. При выводе информации наружу или получении данных символы перекодируются, то же самое произойдет и в том случае, когда будешь получать данные из базы - произойдет перевод из 1251 в UNICODE. При выводе на страницу - обратное преобразование.

Автор: garbuz 4.8.2008, 23:38
Цитата(tux @  4.8.2008,  23:29 Найти цитируемый пост)

1. В принципе неправильно. Кодировка запроса должна быть выставлена до первого обращения к запросу. Нет гарантии, что какой-либо фильтр не поработал с запросом до выполнения сервлета.

Тогда что где ее выставлять чтобы к запросу никто не успел обратиться? В самом начале методов doGet\doPost?



Цитата(tux @  4.8.2008,  23:29 Найти цитируемый пост)
Маппинг этого фильтра стоит первым в списке маппингов в web.xml? Если нет, поставь на первое место.

Стоит первым.

Цитата(tux @  4.8.2008,  23:29 Найти цитируемый пост)
Забудь про такие способы получения кириллических символов. Java и серверы приложений умеют работать с кодировками и без таких извращений.

Понял. Забыл. Самому как-то не понравилось.



Цитата(tux @  4.8.2008,  23:29 Найти цитируемый пост)
Установка кодировки запроса сработает только для метода POST. Если у тебя метод GET,  скорее всего придется конфигурировать веь-контейнер.

Передавал действительно через GET, попробовал через POST, что-то не получается пока.

Что можете сказать про encodeURIComponent?

Автор: garbuz 5.8.2008, 00:31
Проблему решил следующим образом, отправка запроса через POST + Header'ы, все в utf-8
Код

var text = document.getElementById("text").value;
        //alert(text);
        var url = "main.do";
        req = ajaxFunction();
        req.open("POST", url, true);
        var parameters = "text=" + text;
        req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        req.setRequestHeader("Content-length", parameters.length);
        req.setRequestHeader("Connection", "close");
        req.onreadystatechange = updateData;
        req.send(parameters);

на стороне сервера соответственно
Код

 resp.setContentType("text/xml; charset=utf-8");
 String str = req.getParameter("text");

Все, всем спаcибо smile 

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