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