Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> JSP, Servlet, Ajax и кодировка 
V
    Опции темы
garbuz
Дата 4.8.2008, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 677
Регистрация: 22.1.2008

Репутация: 8
Всего: 11



Знаю, сейчас будут пинать ногами, ибо тем про кодировки аж 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 
PM MAIL   Вверх
tux
Дата 4.8.2008, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 74
Всего: 132



По пунктам.

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. При выводе на страницу - обратное преобразование.
PM MAIL Skype GTalk Jabber YIM   Вверх
garbuz
Дата 4.8.2008, 23:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 677
Регистрация: 22.1.2008

Репутация: 8
Всего: 11



Цитата(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?

PM MAIL   Вверх
garbuz
Дата 5.8.2008, 00:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 677
Регистрация: 22.1.2008

Репутация: 8
Всего: 11



Проблему решил следующим образом, отправка запроса через 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 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.1192 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.