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

10.12.11

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

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

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

Файлы

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

Наименование Скачано Купить файл
Пример
.epf 7,02Kb
29 1 850 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

Кому интересна теория - см. 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 - признак того, что декодируется именно такая строка. При значении этого параметра Ложь - обработка как для "обычных" :) интеренет протоколов.

Вступайте в нашу телеграмм-группу Инфостарт

См. также

Загрузка и выгрузка в Excel Универсальные функции Программист 1С:Предприятие 8 Россия Бесплатно (free)

Описанный ниже подход позволяет в три шага заполнять формулы в Excel файлы, вне зависимости от ОС сервера (MS Windows Server или Linux). Подход подразумевает отказ от работы с COM-объектом в пользу работы через "объектную модель документа" (DOM).

30.10.2025    3323    Abysswalker    7    

44

Универсальные функции Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

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

14.05.2025    6193    DeerCven    15    

57

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

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

21.05.2024    48285    dimanich70    83    

169

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

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

1 стартмани

18.03.2024    7258    6    John_d    13    

59

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

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

12.02.2024    60250    atdonya    31    

69

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

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

30.11.2023    9039    ke.92@mail.ru    17    

68
Вознаграждение за ответ
Показать полностью
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Yashazz 4891 12.12.11 01:03 Сейчас в теме
А ещё есть такая штука, regexp называется.
2. Foxx 114 12.12.11 05:14 Сейчас в теме
(1) Yashazz, представьте себе, я в курсе)
Но в данном случае она здесь не помощник.
3. Трактор 1275 14.12.11 10:09 Сейчас в теме
4. Foxx 114 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 114 19.06.12 11:47 Сейчас в теме
(6) Murom, рад, что помогло))
Про кодирование строки в обе стороны - такая задача в данной статье не ставилась, т.к. на инфостарте уже существуют публикации для обратного преобразования. См. например, ссылку в (3)
8. Windsor77 15 31.01.13 12:24 Сейчас в теме
9. Murom 31.01.13 12:33 Сейчас в теме
(8) Windsor77,
Спасибо, посмотрю.
А так уже сам написал и забыл.
Где-то в парсере JSON крутиться. Пока без проблем.
10. graphbuh 257 30.01.17 18:31 Сейчас в теме
Интересно, почему это не работает для запросов яндекса. За пример плюс.
11. Foxx 114 31.01.17 10:17 Сейчас в теме
(10) а что не так с запросами яндекса? Можно пример?
12. graphbuh 257 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 114 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 257 01.02.17 09:20 Сейчас в теме
Спасибо за информацию, Тарас. Вчера вечером прочитал, что начиная с некоторого момента они применяют шифрование (
15. Duke_Lexx 06.04.21 13:08 Сейчас в теме
Спасибо! Это как раз то, что искал. Здоровья тебе, товарищ!
16. astafev 27.09.21 16:14 Сейчас в теме
Есть стандартная функция платформы
РаскодироватьСтроку(НашаСтрокаДляРаскодировки,СпособКодированияСтроки.КодировкаURL);
17. Foxx 114 28.09.21 09:36 Сейчас в теме
(16) это писалось в те времена, когда в платформе не было никаких КодироватьСтроку() и РаскодироватьСтроку()
Для отправки сообщения требуется регистрация/авторизация