Метод WorksheetFunction.EncodeUrl в VBA Excel. URL-кодирование строки (процентное кодирование) для преобразования текста в формат, безопасный для URL.
Метод WorksheetFunction.EncodeUrl
WorksheetFunction.EncodeUrl в VBA Excel используется для процентного кодирования, или URL-кодирования, строки, то есть преобразования текста в формат, безопасный для передачи в URL (например, в HTTP-запросах).Синтаксис метода WorksheetFunction.EncodeUrl:
|
1 |
WorksheetFunction.EncodeUrl(Text) |
Параметр Text — это строка, которую надо закодировать.
URL-кодирование
Суть процентного кодирования
URL-кодирование, или процентное кодирование, является механизмом, который позволяет представлять специальные символы в URL-адресах в безопасном формате. Стандарт RFC 3986, принятый IETF, определяет правила кодирования URL и URI, обеспечивая единообразную интерпретацию адресов в интернете.
Суть процентного кодирования заключается в том, что каждый символ, который не разрешён в URL напрямую, заменяется на символ процента (%), за которым следуют две шестнадцатеричные цифры, представляющие ASCII-код этого символа.
Стандарт RFC 3986 разделяет символы в URL на три категории:
- Зарезервированные символы:
:, /, ?, #, [, ], @, !, $, &, ', (, ), *, +, «,», ;, = - Незарезервированные (безопасные) символы:
A-Z, a-z, 0-9, -, _, ., ~ - Неразрешённые символы: все остальные символы, включая пробелы, специальные символы и символы национальных алфавитов, в том числе, кириллицы.
Незарезервированные символы можно использовать в URL и URI без кодирования — они являются безопасными для использования в URL-адресах.
Зарезервированные символы могут использоваться непосредственно только в своих специальных ролях, например, символ / для разделения компонентов пути. В других случаях они должны быть закодированы.
Неразрешённые символы всегда требуют кодирования.
Таблица частых замен
Примеры самых частых замен зарезервированных и неразрешённых символов, кроме знаков национальных алфавитов:
| Символ | Замена | Символ | Замена | Символ | Замена |
|---|---|---|---|---|---|
! |
%21 |
: |
%3A |
@ |
%40 |
# |
%23 |
; |
%3B |
[ |
%5B |
$ |
%24 |
< |
%3C |
] |
%5D |
% |
%25 |
= |
%3D |
^ |
%5E |
& |
%26 |
> |
%3E |
` |
%60 |
' |
%27 |
? |
%3F |
{ |
%7B |
( |
%28 |
/ |
%2F |
} |
%7D |
) |
%29 |
+ |
%2B |
пробел |
%20 |
* |
%2A |
, |
%2C |
\ |
%5C |
URL-кодирование кириллицы
Процентное кодирование кириллицы и других нелатинских символов осуществляется по следующему алгоритму:
- Символ преобразуется в последовательность байтов в кодировке UTF-8.
- Каждый полученный байт кодируется как % + его шестнадцатеричное значение.
Поскольку в UTF-8 большинство кириллических букв занимают 2 байта, одна русская буква превратится в 6 символов (два блока по %XX).
Примеры для кириллицы:
- а (русская) → байты UTF-8: D0 B0 → %D0%B0
- Я (русская) → байты UTF-8: D0 AF → %D0%AF
- ё (русская) → байты UTF-8: D1 91 → %D1%91
Пользовательская функция URLEncode_UTF8
В версиях Excel до 2013 года встроенного метода WorksheetFunction.EncodeUrl ещё не было. В них его применение вызывает ошибку времени выполнения: Run-time error '1004': Не удалось получить свойство EncodeUrl класса WorksheetFunction.
Для старых версий VBA Excel (до 2013 года) существует пользовательская функция процентного кодирования URLEncode_UTF8:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
Function URLEncode_UTF8(ByVal StringToEncode As String) As String Dim objStream As Object Dim bytes() As Byte Dim i As Long, j As Long Dim result As String Dim char As String Dim code As Long result = "" For i = 1 To Len(StringToEncode) char = Mid(StringToEncode, i, 1) code = AscW(char) ' Получаем Unicode-код символа ' Проверка на "безопасные" символы (unreserved по RFC 3986). ' Используем числовые коды, чтобы избежать проблем с Option Compare Text и русскими буквами. ' 0-9 (48-57), A-Z (65-90), a-z (97-122), - (45), . (46), _ (95), ~ (126) If (code >= 48 And code <= 57) Or _ (code >= 65 And code <= 90) Or _ (code >= 97 And code <= 122) Or _ code = 45 Or code = 46 Or code = 95 Or code = 126 Then ' Безопасный символ оставляем как есть result = result & char Else ' Опасный символ кодируем в UTF-8 байты Set objStream = CreateObject("ADODB.Stream") objStream.Type = 2 ' Текстовый режим objStream.Charset = "utf-8" objStream.Open objStream.WriteText char objStream.Position = 0 objStream.Type = 1 ' Переключаем в бинарный режим objStream.Position = 3 ' Пропускаем BOM (служебные байты EF BB BF) bytes = objStream.Read(-1) ' Читаем байты objStream.Close Set objStream = Nothing ' Преобразуем каждый байт в формат %XX For j = LBound(bytes) To UBound(bytes) result = result & "%" & Right("0" & Hex(bytes(j)), 2) Next j End If Next i URLEncode_UTF8 = result End Function |
Проверяем корректность работы функции URLEncode_UTF8 в версии VBA Excel не старше 2013 года, где уже существует метод WorksheetFunction.EncodeURL:
|
1 2 3 4 |
Sub Test() Debug.Print WorksheetFunction.EncodeURL("Привет, мир! a=1 & b=2") Debug.Print URLEncode_UTF8("Привет, мир! a=1 & b=2") End Sub |
Результат проверки процентного кодирования текста методом WorksheetFunction.EncodeURL и функцией URLEncode_UTF8:
