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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ajax и передача кириллицы в URL, проблема с кодировкой 
:(
    Опции темы
check
Дата 10.11.2008, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 2
Всего: 23



Я уже задавал этот вопрос в разделе JavaScript: http://forum.vingrad.ru/forum/topic-235505...y1693723/0.html 
Цитата

Отправляю post-запрос:
Код

$.post(url,
       {save: true,
       fieldsNum: fieldsNum},
       onSaveSuccess,
       "text"); 


при этом 
Код

url = editDcDocument.html?tptplId=21902&intern=intern&attributes[0].dcVersionAttribute.dcvraTextValue=улица&attributes[1].dcVersionAttribute.dcvraTextValue=1


В request русские символы попадают в таком примерно виде: óëèöà.  На стороне сервера Java-приложение, Spring.
Самое интересное, что сам HTTP-запрос приходит в кодировке UTF-8, как и должно быть.   



Собственно, известна даже причина.  Дело в том, что я передаю данные в URL, но Post-запросом, к чему JQuery похоже оказался не готов. 
То есть если сделать так
Выделить всёкод Javascript
    
Код

$.post(url,
       {save: true,
       fieldsNum: fieldsNum
           street: 'улица'
           },
       onSaveSuccess,
       "text"); 


то кириллица приходит в нормальном виде.
Но мне приходится придерживатся именно такой схемы именования параметров:
Код

attributes[i].dcVersionAttribute.dcvraTextValue


а JS, разумеется, отказывается воспринимать такую конструкцию, как имя переменной.
По этому данные приходится передавать именно в URL.



В общем, по-моему, проблема сводится к тому, что JQuery не правильно кодирует кириллицу в URL, при передаче методом Post.
А вот как кодировать ее правильно, я не знаю.  encodeURIComponent() и encodeURI() не помогли.


Но до сих пор не ясно, где источник проблемы, на клиенте или на сервере.  

Я написал фильтр для перекодировки русских символов из ISO-8859-1 в UTF-8.  
Перекодирую так
Код

 new String(param1.getBytes("ISO-8859-1"),"UTF-8")
 но результат далек от желаемого.

Кроме того в фильтр кириллица приходит уже в виде "óëèöà".  Значит все же уже с клиента приходит не в той кодировке?



PM MAIL   Вверх
necromancer
Дата 10.11.2008, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 317
Регистрация: 26.7.2006
Где: Москва

Репутация: 6
Всего: 7



по сути JS все равно что передавать, кириллицу не кириллицу. он использует транспорт браузера, а уж он в свою очередь кодирует символовы в ISO....
известная давняя проблема:
new String(param1.getBytes("ISO-8859-1"),"UTF-8") - должно помогать в большинстве случаев.
Так же не плохо было бы выставлять у Request charset перед любым обращением за переменными.


--------------------
С уважением, 
                 Виталий Смык
----------------------------------------------------------------------------------------------
SCJP, SCWCD, OCA
http://dev.maryno.net/video/
PM MAIL WWW ICQ Skype   Вверх
check
Дата 10.11.2008, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 2
Всего: 23



Цитата(necromancer @  10.11.2008,  17:50 Найти цитируемый пост)
Так же не плохо было бы выставлять у Request charset перед любым обращением за переменными. 
Выставил в начале фильтра request.setCharacterEncoding("UTF-8") 
Всё то же.

PM MAIL   Вверх
Samotnik
Дата 10.11.2008, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: 5
Всего: 191



check, проблема в связке    Java + POST  запрос + русские буквы
я уже отвечал по этому поводу. Ищи по форуму  
(Я щас тоже поищу))   кто быстрее  smile )

Добавлено через 6 минут и 4 секунды
http://black-zorro.com/mediawiki/Java_ru_1 
вот решение проблемы
PM MAIL   Вверх
check
Дата 10.11.2008, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 2
Всего: 23



Первой строчкой фильтра устанавливаю UTF-8:  request.setCharacterEncoding("UTF-8")
Цитата

Однако для того, чтобы указанное значение кодировки было применено к параметрам переданным методом GET (применительно к tomcat) нужно выполнить правку конфигурационного файла server.xml и добавить для элемента Connector атpибут useBodyEncodingForURI равный значению “true”. В этом случае разбор параметров будет выполнен с такой кодировкой, которую вы установили с помощью вызова request.setCharacterEncoding("utf-8").
После того, как я это сделал, что-то действительно изменилось.
Пришедший в реквесте текст и он же после попытки перекодировать его из ISO-8859-1 в UTF-8  выглядит по-другому.



Что это значит, пока не понял.


 
PM MAIL   Вверх
Samotnik
Дата 10.11.2008, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: 5
Всего: 191



check, фильтр бесполезно ставить )))
Это БАГ java   smile   я  сним столкнулся  год назад ))   post  запрос не работает с русскими символами, пока  не отредаетируеш томкат (как это сделать, ссылку я  привел )
PM MAIL   Вверх
MisterCleric
Дата 11.11.2008, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 33
Всего: 38



Привет. Ребята, не знаю что и как у вас там не настраивается, у меня под JBOSS все работает ок. 
в web.xml поставил такой фильтр:
Код

public class SetCharacterEncodingFilter implements Filter {

    private static final String FILTERABLE_CONTENT_TYPE = "application/x-www-form-urlencoded";

    private static final String ENCODING_DEFAULT = "UTF-8";

    private static final String ENCODING_INIT_PARAM_NAME = "encoding";

    private String encoding;

    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse resp,
                         FilterChain chain) throws ServletException, IOException {
        String contentType = req.getContentType();
        if (contentType != null && contentType.startsWith(FILTERABLE_CONTENT_TYPE))
            req.setCharacterEncoding(encoding);
        chain.doFilter(req, resp);
    }

    public void init(FilterConfig config) throws ServletException {
        encoding = config.getInitParameter(ENCODING_INIT_PARAM_NAME);
        if (encoding == null)
            encoding = ENCODING_DEFAULT;
    }
}



обратите внимание, что он применяеться только для отправленных форм

на каждой своей jsp ставлю такую дерективу:
Код

<%@ page contentType="text/html;charset=UTF-8" language="java" %>


и все отлично постится. 

В  jboss-tomcat server.xml ничего не менял.

может сам jboss где-то что переопределяет, но я явно вижу, что отправленные мной запросы закодированы в UTF-8


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
check
Дата 11.11.2008, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 2
Всего: 23



Цитата(Samotnik @  10.11.2008,  20:06 Найти цитируемый пост)
post  запрос не работает с русскими символами
Проблема именно с передачей русских символов в урле, всё равно каким методом, get или post.  Я сталкивался с таким прежде, когда просто передавал русский текст в jsp Get-параметрами.  
Тогда я просто перекодировал нужный параметр вот так
Код

new String(param.getBytes("ISO-8859-1"),"UTF-8")

Сейчас это не помогает.



Цитата(MisterCleric @  11.11.2008,  10:03 Найти цитируемый пост)
обратите внимание, что он применяеться только для отправленных форм
Вот именно.  А попробуй отправить ту же форму на такой урл:
Код

/tvoj_url?param=любойрусскийтекст

и получить русский текст в нормальном виде.  Если это получится, то будет по крайней мере ясно, что дело в Томкате.

PM MAIL   Вверх
MisterCleric
Дата 11.11.2008, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 33
Всего: 38



Насчет томкат или не томкат.
к сожалению некогда писать вся-разна тесты. Но приведу пример:
В моем приложении есть такая серъезная часть, как отчеты. Данный механизм реализует FastReport. Он принимает параметры урлом на своей сервер по http в кодировке UTF-8. Я из Java вызываю URLConnection на этот сервер отчетов а параметры добавляю в этот урл так:
Код

  val.append("&").append(prop).append("=").
                        append(URLEncoder.encode(result.toString().replaceAll(System.getProperty("line.separator"), " "), "UTF-8"));


т.е. насильно говорю, что данная строка будет в UTF-8. 
Идею сделать так подчерпнул из HTTP Heders, которые формирует броузер перед отправкой запроса

Добавлено через 1 минуту и 19 секунд
to Moderators
почему написал мой код как Javascript?... странновато


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
check
Дата 12.11.2008, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 2
Всего: 23



Цитата(MisterCleric @  11.11.2008,  11:05 Найти цитируемый пост)
т.е. насильно говорю, что данная строка будет в UTF-8
У меня URL формируется в JS,  там нельзя принудительно установить кодировку.

Цитата(MisterCleric @  11.11.2008,  11:05 Найти цитируемый пост)
to Moderators
почему написал мой код как Javascript?... странновато 
Это был намёк)

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.1006 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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