Russian Qt Forum
Ноябрь 24, 2024, 15:13 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [решено] Escape-последовательность для QUrl  (Прочитано 7510 раз)
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« : Март 06, 2010, 18:49 »

Всем привет. Вопрос такой, есть урл вида: google.com.ua/search?hl=ru&q=квартиры+киева&start=30&sa=N.
Javascript (методом encodeURI() например, который используется для определения document.URL) замещает символы этого адреса некоторыми escape-последовательностями UTF-8, кроме зарезервированных символов.
Как результат после замещениий, он выдаёт: google.com.ua/search?hl=ru&q=%D0%BA%D0%B2%D0%B0%D1%80%D1%82%D0%B8%D1%80%D1%8B+%D0%BA%D0%B8%D0%B5%D0%B2%D0%B0&start=30&sa=N.
А в случае QUrl можно ли также делать? - одним методом или как-то хоть с меньшим объёмом нагрузки, чтобы не грузить лишний раз проц этим кодом (написал, т.к. другого способа пока не нашёл):
Код
Java
  QUrl url = new QUrl();
  String strJsUrl;
  ...
   this.url.setUrl(this. strJsUrl);
   this.strJsUrl = "";
   if (this.url.queryItems().size() > 0)
   {
    this.strJsUrl = "?" + this.strJsUrl;
    for (QPair pair : this.url.queryItems())
    {
     this.strJsUrl += pair.first + "=";
     this.strJsUrl += QUrl.toPercentEncoding(pair.second.toString(), new QByteArray("/,,/,\\,?,:,@,&,=,+,$,#,-,_,.,!,~,*,',(,)"));
     this.strJsUrl += "&";
    }
     this.strJsUrl = this.strJsUrl.substring(0, this.strJsUrl .length() - 1);
   }
 
   this.strJsUrl = "http://" + this.url.host() + this.url.path() + this.strJsUrl;
 

« Последнее редактирование: Март 07, 2010, 00:53 от serg_hd » Записан

kubuntu/Win7/x64/NetBeans
SimpleSunny
Гость
« Ответ #1 : Март 06, 2010, 21:40 »

А чем стд поведение QByteArray QUrl::toPercentEncoding  не устраивает?
Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #2 : Март 06, 2010, 23:25 »

А чем стд поведение QByteArray QUrl::toPercentEncoding  не устраивает?
Тем, что его нельзя применить именно так, как это делает javascript - нету никакого обхода спецсимволов, шифрует всё подряд. Поэтому я и привёл код, который это позволяет (в некоторой степени) обойти. Но писанины много, в javascript'e для этого только одна ф-я, а тут как-то через ж..пу, надо перебирать отдельно все элементы query, шифровать исключая спецсимволы и т.п.
« Последнее редактирование: Март 06, 2010, 23:32 от serg_hd » Записан

kubuntu/Win7/x64/NetBeans
SimpleSunny
Гость
« Ответ #3 : Март 06, 2010, 23:58 »

Можно явно указать символы, которые стоит шифровать, и которые не стоит
Цитировать
QByteArray QUrl::toPercentEncoding ( const QString & input, const QByteArray & exclude = QByteArray(), const QByteArray & include = QByteArray() )   [static]
Returns an encoded copy of input. input is first converted to UTF-8, and all ASCII-characters that are not in the unreserved group are percent encoded. To prevent characters from being percent encoded pass them to exclude. To force characters to be percent encoded pass them to include.

Код:
QUrl::toPercentEncoding("google.com.ua/search?hl=ru&q=квартиры+киева&start=30&sa=N", "/?=+&")
Записан
zenden
Гость
« Ответ #4 : Март 07, 2010, 00:07 »

QUrl::toEncoded ()  не пробовали?
Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #5 : Март 07, 2010, 00:42 »

QUrl::toEncoded ()  не пробовали?
Пробовал, не так он совсем кодирует, если русский, то одни знаки вопросов.
Записан

kubuntu/Win7/x64/NetBeans
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #6 : Март 07, 2010, 00:52 »

Можно явно указать символы, которые стоит шифровать, и которые не стоит
Цитировать
QByteArray QUrl::toPercentEncoding ( const QString & input, const QByteArray & exclude = QByteArray(), const QByteArray & include = QByteArray() )   [static]
Returns an encoded copy of input. input is first converted to UTF-8, and all ASCII-characters that are not in the unreserved group are percent encoded. To prevent characters from being percent encoded pass them to exclude. To force characters to be percent encoded pass them to include.

Код:
QUrl::toPercentEncoding("google.com.ua/search?hl=ru&q=квартиры+киева&start=30&sa=N", "/?=+&")
Что-то меня перемкнуло именно за query-секции, а не на url'e в целом. Надо было конечно применить метод ко всему адресу:
Код
Java
QUrl.toPercentEncoding("http://www.google.com.ua/search?hl=ru&q=квартиры+киева&start=30&sa=N",
                                           new QByteArray("/,,/,\\,?,:,@,&,=,+,$,#,-,_,.,!,~,*,',(,)"))
 
В исключения внёс именно те символы, которые внесены у javascript. Спасибо, помогло. Очевидно, что этот вариант намного больше подходит, чем мой первоначальный.
« Последнее редактирование: Март 07, 2010, 00:53 от serg_hd » Записан

kubuntu/Win7/x64/NetBeans
zenden
Гость
« Ответ #7 : Март 07, 2010, 01:05 »

Пробовал, не так он совсем кодирует, если русский, то одни знаки вопросов.

а может это вы не разобрались с кодировками?

потому что эта функция преобразовала ваш пример абсолютно также, как вы показали в первом сообщении.
Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #8 : Март 07, 2010, 01:20 »

Пробовал, не так он совсем кодирует, если русский, то одни знаки вопросов.

а может это вы не разобрались с кодировками?

потому что эта функция преобразовала ваш пример абсолютно также, как вы показали в первом сообщении.
Не знаю, может быть. Я просто применял этот метод к объекту QUrl (значение которого содержало кириллицу) и выводил результат в консоль - были знаки вопросов, что отсылается на сервер не проверял. В случае toPercentEncoding() всё выводилось в консоль именно так как надо, да и стат. метод это, мне его удобнее использовать, т.к. не нужно создавать объект - в мою задачу входило только имея обычный url преобразовать его в url по принципу javascript. Но за совет конечно спасибо.
Записан

kubuntu/Win7/x64/NetBeans
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.121 секунд. Запросов: 23.