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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [решено] Escape-последовательность для QUrl  (Прочитано 7711 раз)
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.045 секунд. Запросов: 19.