Russian Qt Forum

Qt => Работа с сетью => Тема начата: serg_hd от Март 06, 2010, 18:49



Название: [решено] Escape-последовательность для QUrl
Отправлено: serg_hd от Март 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;
 



Название: Re: Escape-последовательность для QUrl
Отправлено: SimpleSunny от Март 06, 2010, 21:40
А чем стд поведение QByteArray QUrl::toPercentEncoding  не устраивает?


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


Название: Re: Escape-последовательность для QUrl
Отправлено: SimpleSunny от Март 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", "/?=+&")


Название: Re: Escape-последовательность для QUrl
Отправлено: zenden от Март 07, 2010, 00:07
QUrl::toEncoded ()  не пробовали?


Название: Re: Escape-последовательность для QUrl
Отправлено: serg_hd от Март 07, 2010, 00:42
QUrl::toEncoded ()  не пробовали?
Пробовал, не так он совсем кодирует, если русский, то одни знаки вопросов.


Название: [решено] Escape-последовательность для QUrl
Отправлено: serg_hd от Март 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. Спасибо, помогло. Очевидно, что этот вариант намного больше подходит, чем мой первоначальный.


Название: Re: Escape-последовательность для QUrl
Отправлено: zenden от Март 07, 2010, 01:05
Пробовал, не так он совсем кодирует, если русский, то одни знаки вопросов.

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

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


Название: Re: Escape-последовательность для QUrl
Отправлено: serg_hd от Март 07, 2010, 01:20
Пробовал, не так он совсем кодирует, если русский, то одни знаки вопросов.

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

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