Декодирование URL

10.12.11

Разработка - Универсальные функции

Иногда бывает нужно декодировать строку вида "c:\documents%20and%20settings\" в удобочитаемый текст. Можно, конечно, заменить все "%20" на пробелы, и считать что задача решена. А если в строке закодированы подобным образом не только пробелы? Если на входе попался URL с кучей подобных "процентов"?

Данная функция сделает правильное декодирование подобной строки.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Пример
.epf 7,02Kb
29
29 Скачать (1 SM) Купить за 1 850 руб.

Кому интересна теория - см. RFC 2396 часть 2

Собственно код:

Функция Из16ВЧисло(Знач Значение)

   
Результат = 0;
   
Множитель = 1;
    Пока
Значение <> "" Цикл
       
Результат = Результат + Множитель * (Найти("0123456789ABCDEF", Прав(Значение,1))-1);
       
Множитель = Множитель * 16;
       
Значение = Лев(Значение,СтрДлина(Значение)-1);
    КонецЦикла;
    Возврат
Результат;

КонецФункции

Функция
ДекодироватьURL(URL, WindowsFileURI=Истина)

   
ДлинаСтроки = СтрДлина(URL);
   
Инд = 1;
   
Результат = "";
   
ПолныйКод = 0;
   
ОсталосьСимволов = 0;

    Пока
Инд <= ДлинаСтроки Цикл

       
Код = КодСимвола(URL, Инд);

        Если
Код = 37 Тогда
           
// Символ(37) = "%"
           
Код = Из16ВЧисло(Сред(URL, Инд+1, 2));
           
Инд = Инд + 2;
        ИначеЕсли
ОсталосьСимволов = 0 Тогда
            Если (
Код = 43) и (не WindowsFileURI) Тогда
               
// Символ(43) = "+"
               
Код = 32; // Символ(32) = " " (пробел)
           
КонецЕсли;
           
Результат = Результат + Символ(Код);
           
Инд = Инд + 1;
            Продолжить;
        КонецЕсли;

        Если
Код <= 127 Тогда
           
// Код = 0b0ххххххх
           
Результат = Результат + Символ(Код);
        ИначеЕсли
Код <= 191 Тогда
           
// Код = 0b10хххххх
           
ПолныйКод = (ПолныйКод*64) + (Код%64); // shl(ПолныйКод, 6) + (Код & 0x3F)
           
ОсталосьСимволов = ОсталосьСимволов - 1;
            Если
ОсталосьСимволов = 0 Тогда
               
Результат = Результат + Символ(ПолныйКод);
            КонецЕсли;
        ИначеЕсли
Код <= 223 Тогда
           
// Код = 0b110ххххх
           
ПолныйКод = Код % 32; // Код & 0x1F
           
ОсталосьСимволов = 1;
        ИначеЕсли
Код <= 239 Тогда
           
// Код = 0b1110хххх
           
ПолныйКод = Код % 16; // Код & 0x0F
           
ОсталосьСимволов = 2;
        ИначеЕсли
Код <= 247 Тогда
           
// Код = 0b11110ххх
           
ПолныйКод = Код % 8; // Код & 0x07
           
ОсталосьСимволов = 3;
        ИначеЕсли
Код <= 251 Тогда
           
// Код = 0b111110хх
           
ПолныйКод = Код % 4; // Код & 0x03
           
ОсталосьСимволов = 4;
        ИначеЕсли
Код <= 253 Тогда
           
// Код = 0b1111110х
           
ПолныйКод = Код % 2; // Код & 0x01
           
ОсталосьСимволов = 5;
        КонецЕсли;

       
Инд = Инд + 1;
    КонецЦикла;

    Возврат
Результат;
КонецФункции

Примеры:

URL = ДекодироватьURL("http://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80");
// URL = "http://ru.wikipedia.org/wiki/Пример"

URL = ДекодироватьURL("c:\documents%20and%20settings\");
// URL = "c:\documents and settings\"

Вот и все)

PS. Очень жаль, что 1С в платформе 8.х до сих пор не реализовала битовых операций. Поэтому реализация данной функции не столь изящна, как могла бы быть.

 

Updated 10.12.11: Исправлена ошибка при декодировании URI в протоколе file:// в Windows. Добавлен второй параметр в функции WindowsFileURI - признак того, что декодируется именно такая строка. При значении этого параметра Ложь - обработка как для "обычных" :) интеренет протоколов.

См. также

Универсальные функции Программист Платформа 1С v8.3 1C:Бухгалтерия Бесплатно (free)

Благодаря этим пяти строчкам можно больше не заморачиваться с загрузкой из внешних файлов. Пользуюсь везде, всегда и постоянно.

21.05.2024    26578    dimanich70    82    

149

Универсальные функции Программист Платформа 1С v8.3 1C:Бухгалтерия Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    4610    4    John_d    11    

57

Универсальные функции Программист Стажер Платформа 1С v8.3 1C:Бухгалтерия Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    27791    atdonya    25    

58

Универсальные функции Программист Платформа 1С v8.3 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    6208    ke.92@mail.ru    17    

65

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист Платформа 1С v8.3 1C:Бухгалтерия Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    17006    YA_418728146    8    

170

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    4406    75    progmaster    11    

4

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 1C:Бухгалтерия 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    19348    184    sapervodichka    112    

137
Вознаграждение за ответ
Показать полностью
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Yashazz 4809 12.12.11 01:03 Сейчас в теме
А ещё есть такая штука, regexp называется.
2. Foxx 110 12.12.11 05:14 Сейчас в теме
(1) Yashazz, представьте себе, я в курсе)
Но в данном случае она здесь не помощник.
3. Трактор 1265 14.12.11 10:09 Сейчас в теме
4. Foxx 110 14.12.11 11:08 Сейчас в теме
Трактор пишет:

Такая публикация уже есть http://infostart.ru/public/70330/

Не совсем так. Указанная публикация выполняет преобразование в обратную сторону :). Т.е. из "Микроскоп" в "%D0%9C%D0%B8%D0%BA%D1%80%D0%BE%D1%81%D0%BA%D0%BE%D0%BF".

А у меня - из "%D0%9C%D0%B8%D0%BA%D1%80%D0%BE%D1%81%D0%BA%D0%BE%D0%BF" в "Микроскоп" :)
frkbvfnjh; Трактор; +2 Ответить
5. Maks_Payn 17.12.11 13:46 Сейчас в теме
Очень интересно и позновательно! Спасибо! ))
6. Murom 18.06.12 14:20 Сейчас в теме
Спасибо ,помогло.
Как раз собрал для модуль для преобразования в код URL и обратно.
Было бы удобно ,если б в статье была не только процедура декодирования ,но и преобразования в код URL.
7. Foxx 110 19.06.12 11:47 Сейчас в теме
(6) Murom, рад, что помогло))
Про кодирование строки в обе стороны - такая задача в данной статье не ставилась, т.к. на инфостарте уже существуют публикации для обратного преобразования. См. например, ссылку в (3)
8. Windsor77 14 31.01.13 12:24 Сейчас в теме
9. Murom 31.01.13 12:33 Сейчас в теме
(8) Windsor77,
Спасибо, посмотрю.
А так уже сам написал и забыл.
Где-то в парсере JSON крутиться. Пока без проблем.
10. graphbuh 261 30.01.17 18:31 Сейчас в теме
Интересно, почему это не работает для запросов яндекса. За пример плюс.
11. Foxx 110 31.01.17 10:17 Сейчас в теме
(10) а что не так с запросами яндекса? Можно пример?
12. graphbuh 261 31.01.17 12:36 Сейчас в теме
Пожалуйста, Тарас.
допустим здесь я пишу поиск - "веселые картинки" в форме поиск яндекса
http://www.proza.ru/search.html
после этого открывается страница запроса с текстом
http://www.proza.ru/cgi-bin/search.pl?text=%E2%E5%F1%E5%EB%FB%E5+%EA%E0%F0%F2%E8%ED%EA%E8&searchid­=126972&l10n=ru&web=0#1073
т.е. кусок %E2%E5%F1%E5%EB%FB%E5+%EA%E0%F0%F2%E8%ED%EA%E8 это закодированная кириллица.
получаю

http://www.proza.ru/cgi-bin/search.pl?text=+&searchid=126972&l10n=ru&web=0#1073
13. Foxx 110 31.01.17 16:56 Сейчас в теме
(12) там они изобрели свой собственный способ кодирования).

У них там строка закодирована в кодировке Windows-1251 (судя по внешнему виду, не проверял)
А моя функция декодирует UTF-8

"веселые картинки" по-правильному URL-кодированию будет
%D0%B2%D0%B5%D1%81%D0%B5%D0%BB%D1%8B%D0%B5%20%D0%BA%D0%B0%D1­%80%D1%82%D0%B8%D0%BD%D0%BA%D0%B8

14. graphbuh 261 01.02.17 09:20 Сейчас в теме
Спасибо за информацию, Тарас. Вчера вечером прочитал, что начиная с некоторого момента они применяют шифрование (
15. Duke_Lexx 06.04.21 13:08 Сейчас в теме
Спасибо! Это как раз то, что искал. Здоровья тебе, товарищ!
16. astafev 27.09.21 16:14 Сейчас в теме
Есть стандартная функция платформы
РаскодироватьСтроку(НашаСтрокаДляРаскодировки,СпособКодированияСтроки.КодировкаURL);
17. Foxx 110 28.09.21 09:36 Сейчас в теме
(16) это писалось в те времена, когда в платформе не было никаких КодироватьСтроку() и РаскодироватьСтроку()
Оставьте свое сообщение