delphi url кодирование строки
Delphi url кодирование строки
PS: возможности определить, какой браузер передал ссылку нет

Lamer@fools.ua © ( 2009-07-28 15:55 ) [1]
В заголовке запроса кодировка УРЛа должна передаваться, вроде.

TIF © ( 2009-07-28 15:57 ) [2]
> В заголовке запроса
Нет никакого заголовка. В наличии только ссылка.

clickmaker © ( 2009-07-28 16:07 ) [3]
> Программа получает из браузера ссылку
из адресной строки? IE 7 на английской винде кодирует так: AbCdEf%c0%e1%c2%e3%c4%e5

Anatoly Podgoretsky © ( 2009-07-28 16:07 ) [4]
Тогда ни как, кроме методом проб и ошибок. Но зато вариантов всего лишь два.
И предположение насчет браузеров, кто как кодирует в принципе неверное.
> из адресной строки?
Нет. Pluggable protocol
> Anatoly Podgoretsky © (28.07.09 16:07) [4]
> Тогда никак, кроме методом проб и ошибок
Ну есть конечно вариант, внедрить в ссылку в заранее определенное место пару буковок и анализировать их, но хочется простое решение, должно же оно быть.
У меня мысли крутятся вокруг UTF-8:
Текст, состоящий только из символов с номером меньше 128, при записи в UTF-8 превращается в обычный текст ASCII. И наоборот, в тексте UTF-8 любой байт со значением меньше 128 изображает символ ASCII с тем же кодом.
Тут похожая ситуация. Только провести параллели бы какие-то.

Anatoly Podgoretsky © ( 2009-07-28 16:52 ) [6]
Никаких паралелей, один и тот же текст «AbCdEf%D0%90» может быть как OEM, так и ANSI, так и UTF-8

clickmaker © ( 2009-07-28 16:59 ) [7]
а программа на дельфи?
я бы погуглил по словам UrlDecode Delphi

Anatoly Podgoretsky © ( 2009-07-28 17:01 ) [8]
> clickmaker (28.07.2009 16:59:07) [7]
Без знания кодировки это мало чем поможет.

antonn © ( 2009-07-28 17:02 ) [9]
> Никаких паралелей, один и тот же текст «AbCdEf%D0%90» может
> быть как OEM, так и ANSI, так и UTF-8
AbCdEf%D0%90 только в UTF читаем как обычный текст.
> TIF © (28.07.09 15:51)
ищи %D0 и смотри парные ему, он в UTF есть
Строку, требующую раскодирования можно отличить от строки, не требующей раскодирования наличием в ней паттерна, удовлетворяющего регулярному выражению %\w<2>.
После преобразования последовательностей кодов в байты наличие UTF-8 с большой вероятностью можно определить соответствием последовательностей байтов в строке следующим паттернам (см. RFC utf-8).
Char. number range | UTF-8 octet sequence
(hexadecimal) | (binary)
———————+———————————————
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

TIF © ( 2009-07-28 17:35 ) [11]
> я бы погуглил по словам UrlDecode Delphi
Уже скачал несколько URLEncode и URLDecode функций, но самое весёлое, что они не работают в D2009 (дополнительные проблемы с кодировкой лезут).

Anatoly Podgoretsky © ( 2009-07-28 19:02 ) [12]

Anatoly Podgoretsky © ( 2009-07-28 19:05 ) [13]

Пит ( 2009-07-29 13:30 ) [14]
Я уже поднимал ветку по этому поводу.
Да, это URL кодирование (через проценты), в одном случае кодируеся win-1251, в другом случае unicode (поэтому два байта на символ).
В общем случае определить невозможно формат. Но есть способы догадаться. Даже в windows API вроде есть встроенная функция, которая с определенной вероятностью пытается определить набор символов, ANSI или Wide. Не помню как называется, в Рихтере есть.
Например, Гугл это делает достаточно хорошо. Кодировки разные:
а результат одинаковый.
> в windows API вроде есть встроенная функция
IsTextUnicode

Anatoly Podgoretsky © ( 2009-07-29 13:40 ) [16]
> Пит (29.07.2009 13:30:14) [14]
Попробуй изменить %D0%BF на %D0%01 и посмотри на результат
Гугл обладает излишней информацией и плюс проверяет по словарю.

Anatoly Podgoretsky © ( 2009-07-29 13:44 ) [17]
Заодно можешь провести тоже и для ANSI может даже нагляднее будет.

Пит ( 2009-07-29 17:56 ) [18]
А к чему вы это говорите? Тон как будто опровергаете, а смысл как будто подтверждаете.
Естественно, это косвенные методы определения, точно также как и у IsTextUnicode. Ясно было сказано:
>В общем случае определить невозможно формат

blackman © ( 2009-07-29 20:06 ) [19]
procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.Text := HTTPEncode(Edit1.Text);
end;
http://www.swissdelphicenter.ch/
Кроме того на этом сайте тоже кое что есть
http://www.delphimaster.ru/books/978594723593/fragment.html

Piter © ( 2009-07-29 22:24 ) [20]
blackman © (29.07.09 20:06) [19]
по-моему, ты нифига не въехал в квалификацию автора вопроса и в то, что он собственно хочет.
Вопрос не в том, откуда это взялось, с самого начала вроде автор дал понять, что он прекрасно понимает, что есть ANSI, а есть unicode.

Anatoly Podgoretsky © ( 2009-07-29 23:01 ) [21]
> Piter (29.07.2009 22:24:20) [20]
При том определить не с помощью Гугловеба, а автономно, Гугловеб вносит искажения в процесс определения, поскольку добавляется информация о локальной кодировке компьютера. Наиболее качественное решение в [10] вероятность будет высокая и пропорциональна длине ссылке. Надо только учесть, что не все символы в диапазоне 00-7F выводятся указаным кодом, по правилам на URI их тоже надо экранировать, но уже однобайтным кодом. Список этих кодов также есть в RFC и также особенность вывода пробелов, они заменяются по другой схеме.

TIF © ( 2009-07-30 00:04 ) [22]
> Piter © (29.07.09 22:24) [20]
> blackman © (29.07.09 20:06) [19]по-моему, ты нифига не
> въехал в квалификацию автора вопроса и в то, что он собственно
> хочет.
+1 🙂
Anatoly Podgoretsky © (29.07.09 23:01) [21]
> Наиболее качественное решение в [10] вероятность будет высокая
> и пропорциональна длине ссылке.
Наверное в скором времени доведу до ума это распознавание, хоть оно и не идеальное, но пока всё-таки решил не мучаться и внедрять в начало ссылки короткое слово кириллицей (какой-нибудь маленький предлог, чтоб хоть со смыслом смотрелся, что-то вроде «Open?Для=http://») и ориентироваться по нему
> Из приведеных, только Chrome соответствует RFC для ANSI

Anatoly Podgoretsky © ( 2009-07-30 09:38 ) [23]
> TIF (30.07.2009 00:04:22) [22]
Я не знаю, насколько извращен, я просто вижу по приведеным ссылкам

Anatoly Podgoretsky © ( 2009-07-30 09:42 ) [24]
> TIF (30.07.2009 00:04:22) [22]
Приведение к нижнему регистру, идиотичние не придумать, это же полный капец. Наверно у них там в Гугле все в нижнем регистре, вот и думают, что у других также.
ЗЫ: как на самом деле я не знаю.
Кстати я бы не стал делать вывод, насчет ИЕ, что мол он посылает как есть, этот браузер много хитрее.

TIF © ( 2009-08-06 20:18 ) [25]
Для полной уверенности прогнал функцию ещё по нескольким тестам, она их прошла успешно:
AbCdEf%D0%90%E2%82%AC
опции?
опции?
опции опции?
опции опции?
Тестовая ссылка
Тестовая ссылка
Тестовая ссылка Тестовая ссылка
Тестовая ссылка Тестовая ссылка
addАдressрес
addАдressрес
addАдressрес addАдressрес
addАдressрес addАдressрес
[AbCdEfАбВгДе]
[AbCdEfАбВгДе]
[AbCdEfАбВгДе] [AbCdEfАбВгДе]
[AbCdEfАбВгДе] [AbCdEfАбВгДе]

Piter © ( 2009-08-07 21:46 ) [26]
TIF © (06.08.09 20:18) [25]
Только работает это и без вычисления вероятностей
не пиши фигни. Способ предложенный Noctis»ом лишь один из способов. Который тоже может ошибиться, особенно если его применять как универсальный для ВСЕХ языков.
TIF © (06.08.09 20:18) [25]
Яндекс с Google преобразуют мешашину «жёстко»,
и это правильно. Строка может быть ANSI, может быть Unicode, но она никак не может быть смешанной, это против всех стандартов.

TIF © ( 2009-08-08 00:12 ) [27]
> Способ предложенный Noctis»ом лишь один из способов
А я о чём, собственно? 🙂 О своём способе. Об одном из множества (хотя все способы будут во многом похожими). Я в нём обошёлся без вероятностей.
Но! В рамках поставленной передо мной задачи созданный алгоритм работает: поедает закодированную %-ами ссылку (хоть ANSI, хоть Unicode), а выдаёт правильный результат.
PS: чуть не забыл. Оформлю функцию, чтобы выглядела более-менее прилично, и выложу сюда

Piter © ( 2009-08-08 11:20 ) [28]
TIF © (08.08.09 0:12) [27]
Так что иногда приходится приспосабливаться к самому неожиданному
ну так приспособь еще к тому, что вдруг данные в URL закодированы XOR»ом по паролю, брутфорс хотя бы встрой. Остальое комментировать просто лень, ходьба по кругу.

TIF © ( 2009-08-10 07:09 ) [29]
> Оформлю функцию, чтобы выглядела более-менее прилично, и
> выложу сюда
И выложу сюда ссылку 🙂
Как использовать кириллицу в параметрах запроса IdHTTP?
Помощь в написании контрольных, курсовых и дипломных работ здесь.
IdHTTP или TIdMultiPartFormDataStream передает кириллицу в неправильной кодировке
Программа должна передавать на php страничку некоторые данные, а страничка записывает их в MySQL.
Как преобразовать кириллицу в формат пригодный для get-запроса
Подскажите, ребят, как преобразовать кириллицу в формат пригодный для get-запроса средством C#.
Как использовать одновременно 2 idhttp
Если на форму добавить 2 компонента idhttp и 2 idssliohandlersocket, связать их, закинуть в папку.
О параметрах запроса в MS Access 2000
Подскажите, пожалуйста, как сделать запрос параметром, чтобы пользователь не вводил вручную условие.
Ошибка Project Project1.exe raised exception class eidhttpprotocolexception with message ‘http/1.1 500 internal server error’.
Также пробовал использовать функцию
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Русские символы (слова) в параметрах запроса
Доброго времени суток. Ребят вопрос. Делаю (учу) сервлеты и есть запросы где в параметрах.
Можно ли использовать в SQL запросе кириллицу
Доброго всем времени суток. Есть скрипт который выбирает данные из одной базы данных, затем второй.
IdHTTP и IdHTTP сервер: как отправить сообщение от сервера к клиенту?
Всем привет, отправляю файл по частям с клиента на сервер, и хочу получать обратное сообщение, что.
. when altering one’s mind becomes as easy as programming a computer, what does it mean to be human.
30 апреля 2010 г.
Работа с текстовыми файлами в любой кодировке из Delphi до 2009
Как должно быть известно любому программисту, не существует такой вещи как «просто текстовый файл». Если вы не знаете, в какой кодировке хранится строка, вы не только не сможете её показать, но даже определить, где она заканчивается.
Мир вокруг нас уже давно не ограничивается ANSI, а уж тем более ASCII. На фоне этого ваши древние ANSI-программы выглядят не очень-то хорошо. Потому что они молчаливо игнорируют существование альтернативных кодировок вообще. Для них существует только текущая кодовая страница ANSI, не больше и не меньше.
Как это реализуется в Delphi? В Delphi 2009 и выше у вас появляется класс TEncoding, позволяющий работать с различными кодировками. Класс TStrings (и TStringList) используют TEncoding для определения кодировки файла и всех преобразований.
Было бы неплохо заиметь такую штуку, скажем в Delphi 7 или Delphi 2007? К счастью, это очень просто сделать (эй, это заняло примерно 8 минут моего времени, включая проверку). Нужно просто вытащить из Delphi 2010 код TEncoding и новые методы LoadFromFile(Stream)/SaveToFile(Stream).
Второй модуль, StringListUnicodeSupport.pas методом Geo добавляет в обычный TStringList поддержку произвольной кодировки, а также перегруженные варианты методов загрузки и сохранения, позволяющие указать кодировку явно (SaveToFile/Stream сохраняют в ANSI, если вам нужна другая кодировка, вы должны указать её вторым параметром).
Вам достаточно подключить StringListUnicodeSupport в uses и вы волшебным образом получаете возможность работы с любыми текстовыми файлами:
Как пользователи динозаврических Delphi вы, вероятно, не знакомы с TEncoding и перегруженным вариантом методов TStrings. Что ж, к счастью, вы можете воспользоваться online-справкой: TEncoding, использование TEncoging, LoadFromFile, SaveToFile.
Delphi url кодирование строки
Интернет ломает географические барьеры, обеспечивая возможность распространения программного обеспечения по всему миру. В результате приложения больше не могут использоваться в среде на основе одной только кодировки ANSI. В мире кодировка Unicode была воспринята как стандартное средство передачи текста и данных. Так как ею поддерживается фактически любая система письма в мире, текст в кодировке Unicode теперь является нормой в глобальном научно-техническом сообществе.
Что такое кодировка Unicode
Кодировка Unicode представляет собой схему кодировки символов, которая позволяет кодировать практически все алфавиты в виде одного набора символов. Кодировка Unicode позволяет компьютерам представлять текст для большинства систем письма в мире и обращаться с ним. Разработка кодировки Unicode поддерживается организацией Unicode Consortium и кодифицируется как стандарт. Проще говоря, кодировка Unicode представляет собой систему, позволяющую каждому использовать любые другие алфавиты. Представьте себе, существует даже версия Unicode клингонского языка.
Преимущества кодировки Unicode
Переход на кодировку Unicode в Delphi вполне естественен. ОС Windows сама по себе полностью поддерживает кодировку Unicode, так что даже естественно, что приложениями, созданными для нее, строка Unicode используется как тип строки по умолчанию. И преимущества для разработчиков на Delphi не исчерпываются только возможностью использовать такой же тип строки, как и в Windows.
Что касается существующих приложений Delphi на основе кодировки ANSI, то возможность локализации приложений и их распространения на рынке приложений с поддержкой Unicode в перспективе очень велика. И если необходимо локализовать приложения, среда Delphi позволяет сделать это очень просто, особенно непосредственно во время разработки. Интегрированная среда перевода (ITE) позволяет переводить, компилировать и развертывать приложение непосредственно в интегрированной среде разработки IDE. Если необходимы услуги по переводу извне, среда IDE позволяет экспортировать проект в такой форме, которая может использоваться переводчиками вместе с развертываемым приложением External Translation Manager (Диспетчер внешних переводов). Данный инструментарий работает вместе со средой Delphi IDE, и для среды Delphi, и для среды C++Builder, позволяя локализовать приложения при согласованном и простом управлении процессом.
Кодировка Unicode широко распространена в мире, и теперь разработчики на Delphi могут стать его частью естественным и органичным образом. Таким образом, если необходима возможность обработки данных в кодировке Unicode или есть стремление продавать приложения на растущих глобальных рынках, можно делать это с помощью Delphi 2009.
Немного о терминологии
Кодировка Unicode подразумевает использование некоторых новых терминов. Например, понятие «символ» в системе понятий Unicode менее точно, чем то, к которому, по-видимому, привыкли разработчики. Для кодировки Unicode более точным термином является «элемент кода». В Delphi 2009 размер SizeOf(Char) = 2, но даже и это не всегда. В зависимости от кодировки, это значение для данного символа может принимать значение больше двух байтов. Такие последовательности называются «суррогатными парами». Итак, элемент кода представляет собой уникальный код, назначенный элементу, определенному организацией Unicode Consortium (Unicode.org). Чаще всего это то же самое, что «символ», но не всегда.
Теперь, после всех объяснений, рассмотрим, как в Delphi 2009 реализуется строка Unicode.
Новый тип UnicodeString
Для Delphi 2009 был разработан новый тип UnicodeString, который объединяет возможности типов AnsiString и WideString. Строка UnicodeString может содержать как символы Unicode, так и символы ANSI. (Необходимо заметить, что будут сохранены типы AnsiString и WideString.) Типы Char и PChar будут преобразованы соответственно в типы WideChar и PWideChar. Следует также заметить, что не были исключены никакие типы строк. По-прежнему сохраняются и доступны для использования все использовавшиеся разработчиками типы.
То есть для компилятора задается следующий код:
Присвоение типа UnicodeString совместимо со всеми другими типами строк, однако присвоения между AnsiStrings и UnicodeStrings будут вызывать соответствующие преобразования типов. Таким образом, присвоение типа UnicodeString типу AnsiString может привести к потере данных. То есть если строка UnicodeString содержит данные со старшими байтами, преобразование такой строки в строку AnsiString приведет к потере старших байтов данных.
Важно отметить, что новый тип UnicodeString имеет те же возможности, что и другие типы строк (за исключением, конечно, возможности содержать данные в кодировке Юникод). По-прежнему можно добавлять к ним любые строковые данные, индексировать их, объединять их знаком «+» и так далее.
Например, экземпляры строки UnicodeString все так же позволяют индексировать символы. Рассмотрим следующий код:
Переменная MyChar будет содержать символ, находящийся на первой позиции индекса, то есть «T». Функциональное содержание данного кода никак не изменилось. Аналогично, при обработке данных в кодировке Unicode:
Переменная MyChar будет содержать символ, находящийся на первой позиции индекса, то есть «世».
Библиотека RTL содержит вспомогательные функции, которые позволяют пользователям выполнять явные преобразования кодовых страниц и размеров элементов. Если пользователь применяет функцию Move для массива символов, он не в состоянии учитывать размер элементов.
Заключение
После добавления к среде Delphi поддержки кодировки Unicode как строки по умолчанию стало возможным принимать, обрабатывать и отображать фактически любые существующие в мире алфавиты или кодовые страницы. Приложения, создаваемые в среде Delphi 2009, будут способны принимать, отображать и обрабатывать текст в кодировке Unicode с достаточной простотой, и они будут работать гораздо лучше в любой языковой версии ОС Windows. Разработчики на Delphi смогут теперь с легкостью локализовать и переводить свои приложения, чтобы выйти на рынки, появиться на которых ранее им было гораздо сложнее. Теперь приложения Delphi могут функционировать везде в мире, где необходима поддержка Unicode.
В Части II будут рассмотрены изменения и обновления библиотеки Delphi Runtime Library, которые упрощают работу со строками в кодировке Unicode.
