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