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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Расшифровать URL, криво закодированная кириллица 
:(
    Опции темы
Hidrag
Дата 14.7.2010, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Есть веб апликуха, построенная на спринге 2.5.6, развернутая на томкате.

От клиента приходит запрос по урлу, вида:
http : // host/search.html?search_text=%u041c%u043e%u0441%u043a%u0432%u0430+-+%u041a%u043e%u0440%u043f%u043e%u0440%u0430%u0442%u0438%u0432%u043d%u044b%u0439+%u043d%u0430

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

Вопрос: есть ли готовые вменяемые средства для перекодирования параметров запроса в таком виде, в вменяемую строку? Или тут только ручная посимвольная практически обработка поможет?

Это сообщение отредактировал(а) Hidrag - 14.7.2010, 12:16


--------------------
user posted image
PM WWW ICQ   Вверх
AlexeyVorotnikov
Дата 15.7.2010, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 3
Всего: 18



java.net.URLDecoder


--------------------
RTFM!
Три источника и три составные части Java: The Java Language Specification, Java Platform API Specification, The Java Virtual Machine Specification
PM MAIL   Вверх
Skipy
Дата 15.7.2010, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Hidrag @ 14.7.2010,  12:08)
http : // host/search.html?search_text=%u041c%u043e%u0441%u043a%u0432%u0430+-+%u041a%u043e%u0440%u043f%u043e%u0440%u0430%u0442%u0438%u0432%u043d%u044b%u0439+%u043d%u0430

обратите внимание на параметр, как в нем закодирована кириллица! В чистом виде коды utf-8.

Я Вам один умный вещь скажу, но Вы не обижайтесь. © Это НЕ UTF-8. Коды кириллицы в UTF-8 начинаются с D0 и D1. А у Вас - 04. Это UTF-16, причем судя по порядку байтов - UTF-16BE.

Более того, URLDecoder Вам вряд ли поможет, ибо строка с точки зрения application/x-www-form-urlencoded закодирована неверно - присутствуют лишние 'u', отсутствуют '%' перед КАЖДЫМ байтом. Если ее правильно отформатировать - получается так: 

%04%1c%04%3e%04%41%04%3a%04%32%04%30+-+%04%1a%04%3e%04%40%04%3f%04%3e%04%40%04%30%04%42%04%38%04%32%04%3d%04%4b%04%39+%04%3d%04%30

Значение - "Москва - Корпоративный на"

В общем, я бы разбирал руками. Кстати, это не так страшно. За час пишется.

Это сообщение отредактировал(а) Skipy - 15.7.2010, 10:26


--------------------
С уважением,
Евгений aka Skipy
www.skipy.ru
PM MAIL WWW ICQ   Вверх
Atum
Дата 15.7.2010, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



добрый день smile
только сегодня утром столкнулся с такой задачей : 

декодировать все эти проценты и цифры в символы .

Skipy   , Буду очень  признателен если покажите код как вы их декодировали.
PM MAIL   Вверх
Kircul
Дата 15.7.2010, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Я бы использовал примерно такое регулярное выражение (оно поможет перевести строку в массив байтов):
Код

[^%]|%u([0-9a-f]{2})([0-9a-f]{2})

Каждое совпадение - это либо символ, либо его закодированое представление.
А дальше дело за малым

Это сообщение отредактировал(а) Kircul - 15.7.2010, 11:53
PM   Вверх
Hidrag
Дата 15.7.2010, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Да вот руками в итоге и сделали декодирование, вот метод:

Код

    public static String convertBadString(String inStr) throws UnsupportedEncodingException {
        String outStr = inStr;
        while (outStr.indexOf("%u") != -1) {

            int index = outStr.indexOf("%u");

            String utfcode = outStr.substring(index + 2, index + 6);
            int intCode = Integer.valueOf(utfcode, 16);
            char aChar1 = (char)intCode;

            outStr = outStr.substring(0, index) + aChar1 + outStr.substring(index + 6, outStr.length());
        }
        return outStr;
    }



не очень оптимальна работа со строками, конечно, кому будет нужно, оптимизируют smile

Skipy, спасибо.

Это сообщение отредактировал(а) Hidrag - 15.7.2010, 13:55


--------------------
user posted image
PM WWW ICQ   Вверх
Skipy
Дата 15.7.2010, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Atum @ 15.7.2010,  11:13)
Skipy   , Буду очень  признателен если покажите код как вы их декодировали.

Конкретно эту строку - сначала руками. smile Убрал 'u' и поставил '%' перед всеми байтами. А дальше, когда получил то, что написал в предыдущем после - java.net.URLDecoder.decode(string, "UTF-16BE"). Кодировку ставите нужную.

Добавлено @ 12:28
Можно и не руками. Спасибо Kircul за идею!

Код
String src = "%u041c%u043e%u0441%u043a%u0432%u0430+-+%u041a%u043e%u0440%u043f%u043e%u0440%u0430%u0442%u0438%u0432%u043d%u044b%u0439+%u043d%u0430";
src = src.replaceAll("%u([0-9a-fA-F]{2})([0-9a-fA-F]{2})","%$1%$2");
System.out.println(URLDecoder.decode(src, "UTF-16BE"));


Это сообщение отредактировал(а) Skipy - 15.7.2010, 12:28


--------------------
С уважением,
Евгений aka Skipy
www.skipy.ru
PM MAIL WWW ICQ   Вверх
batigoal
Дата 16.7.2010, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 16
Всего: 151



Hidrag, а какой сервак? В Томкате аналогичную проблему порешал настройками коннектора (у него можно кодировку урлов задать).


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
Skipy
Дата 19.7.2010, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(batigoal @ 16.7.2010,  16:51)
Hidrag, а какой сервак? В Томкате аналогичную проблему порешал настройками коннектора (у него можно кодировку урлов задать).

Это не поможет. Там только кодировку можно задать, а если строка не соответствует application/x-www-fom-urlencoded - tomcat ничего не сделает. Вернее, то, что он сделает, будет даже хуже, чем если бы он ничего не делал.


--------------------
С уважением,
Евгений aka Skipy
www.skipy.ru
PM MAIL WWW ICQ   Вверх
batigoal
Дата 19.7.2010, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 16
Всего: 151



Цитата(Skipy @  19.7.2010,  11:51 Найти цитируемый пост)
Это не поможет. Там только кодировку можно задать, а если строка не соответствует application/x-www-fom-urlencoded - tomcat ничего не сделает. Вернее, то, что он сделает, будет даже хуже, чем если бы он ничего не делал.

В моем случае строка соответствовала x-www-fom-urlencoded, но клиент кодировал в ней UTF-8, а мое приложение по умолчанию декдировало его в cp1252.


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0570 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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