Тема: 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