1

Тема: AHK: Кодировка кириллицы для использования в URL

В URL можно использовать только латинские буквы, цифры, и некоторые знаки препинания. Остальные символы должны быть заменены специальными кодами. Сначала каждый символ кириллицы кодируется в UTF-8 в последовательность из двух байтов, а затем каждый байт этой последовательности записывается в шестнадцатеричном представлении:

М -> D0 и 9C -> %D0%9C
и -> D0 и B8 -> %D0%B8
к -> D0 и BA -> %D0%BA
р -> D1 и 80 -> %D1%80 и т. д.

Перед каждым таким шестнадцатеричным кодом байта, согласно спецификации URL, ставится знак процента (%) — отсюда возник английский термин «percent-encoding», обозначающий способ кодирования символов в URL и URI.

Таким образом, слово "программа" приобретёт вид:

%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B0

Допустима предварительная кодировка слова и в ANSI. Тогда слово "программа" будет выглядеть

%EF%F0%EE%E3%F0%E0%EC%EC%E0

Функция URIEncode() для кодирования в «percent-encoding»:

URIEncode(str, encoding := "UTF-8")
{
   PrevFormat := A_FormatInteger
   SetFormat, IntegerFast, H
; кодируем стоку в указанную кодировку с помощью StrPut()
   VarSetCapacity(var, StrPut(str, encoding))
   StrPut(str, &var, encoding)
; последовательно перебирая символы, кодируем их в URL-формат   
   While code := NumGet(Var, A_Index - 1, "UChar")   ; пока code не равно 0, что означает конец строки
   {
      bool := (code > 0x7F || code < 0x30 || code = 0x3D)   ; отсеиваем символы, которые кодировать не нужно
      UrlStr .= bool ? "%" . SubStr("0" . SubStr(code, 3), -1) : Chr(code)
   }
   SetFormat, IntegerFast, % PrevFormat
   Return UrlStr
}

По умолчанию кодирует в UTF-8, если нужно в ANSI, при вызове указываем вторым параметром "CP0".
Пример использования. Составляем поисковый запрос в Google с кириллицей и кавычками:

text := """кодировка URL"""
GoogleSearch := "https://www.google.ru/search?q="

MsgBox, % url := GoogleSearch . URIEncode(text)
Run, % url

Связанная тема

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder