Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: sh123 от Января 18, 2009, 22:53



Название: QUrl - кодированные и декодированные строки
Отправлено: sh123 от Января 18, 2009, 22:53
Есть окошко в котором есть поле для ввода ссылки и кнопочка. Юзер вводит URL и при нажатии на кнопку вызывается bool QDesktopServices::openUrl ( const QUrl & url ), чтобы открыть броузер по введённой ссылке, казалось бы всё просто, но если юзер ввёл URL, который уже в кодированном виде, но начинаются грабли, так как openUrl вызывает QUrl::toEncoded и все % заменяються на %25. Казалось бы можно вызвать QUrl::fromEncoded перед тем, как юзер ввёл такой адрес, но в этом случае если юзер ввёл нормальную незакодированную ссылку то опять начинаются проблемы. Может кто-нибудь сталкивался с такой проблемой?


Название: Re: QUrl - кодированные и декодированные строки
Отправлено: Dendy от Января 18, 2009, 23:16
QUrl::TolerantMode. QUrl will try to correct some common errors in URLs. This mode is useful when processing URLs entered by users.


Название: Re: QUrl - кодированные и декодированные строки
Отправлено: sh123 от Января 19, 2009, 11:19
Вот тривиальный пример:

QString host = "http://en.wikipedia.org/wiki/%d0%9f%d1%80%d0%b5%d0%b2%d0%b5%d0%b4";
QUrl url(host, QUrl::TolerantMode);
QDesktopServices::openUrl(url);

Открывает:
http://en.wikipedia.org/wiki/%25d0%259f%25d1%2580%25d0%25b5%25d0%25b2%25d0%25b5%25d0%25b4

похоже что TolerantMode не имеет никакого эффекта так как все % заменяются на %25, но урл уже кодированный.


Название: Re: QUrl - кодированные и декодированные строки
Отправлено: lex_newton от Января 19, 2009, 14:35
Сам с такой проблемой не сталкивался.

Грабли, не грабли. а можно через них переступить:
Ищишь в строке введеной пользователем символ "%", если находишь то делаешь QUrl::fromEncoded. Иначе просто открываешь то, что ввел пользователь.

Возможно есть чтото стандартное, но сейчас нет времени искать...


Название: Re: QUrl - кодированные и декодированные строки
Отправлено: Dendy от Января 19, 2009, 14:49
Или я чего-то недопонимаю или это баг в Qt.

Цитировать
Any occurrences of a percent character "%" not followed by exactly two hexadecimal characters (e.g., "13% coverage.html") will be replaced by "%25".

В примере видим что условие удовлетворяется, то-есть "%d0%b4" должно быть заменено на "д". Тем не менее этого не происходит.


Название: Re: QUrl - кодированные и декодированные строки
Отправлено: sh123 от Января 19, 2009, 16:48
Сам с такой проблемой не сталкивался.

Грабли, не грабли. а можно через них переступить:
Ищишь в строке введеной пользователем символ "%", если находишь то делаешь QUrl::fromEncoded. Иначе просто открываешь то, что ввел пользователь.

Возможно есть чтото стандартное, но сейчас нет времени искать...


А если у юзера введена некодированная строка http://somehost.com/lalalala%41456, то используя твой алгоритм она перекодируется в http://somehost.com/lalalalaA456, знак % то допускается в URLе.


Название: Re: QUrl - кодированные и декодированные строки
Отправлено: Dendy от Января 19, 2009, 17:05
Может быть что-то вроде этого подойдёт:

Код:
QUrl url = QUrl::fromEncoded( urlString );
if ( !url.isValid() )
  url.setUrl( urlString );


Название: Re: QUrl - кодированные и декодированные строки
Отправлено: sh123 от Января 19, 2009, 17:28
Мега спасибо, это именно то, что нужно было!!!!