Private KeeperPrivate Keeper
in-Line Kit/Функции in-Line Kit

Кодирование и форматы

Base64, JSON, адреса, Unicode, ANSI, шестнадцатеричные строки и семейство Base с точным различием текста и байтов.

Кодирование меняет представление данных, но не скрывает их. Все функции ниже используют общую запись функций in-Line.

Base64 и шестнадцатеричная запись не являются шифрованием

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

Что выбрать

Текст и Base64

BASE64 и BASE64DECODE нужны для совместимости с простыми текстовыми полями. BASEENCODEDECODE даёт явный выбор UTF-8 и нескольких алфавитов.

Значение внутри формата

ESCJSON подготавливает значение строки JSON, URLENCODE — один параметр адреса, UNICODEDECODE — последовательности \uXXXX.

Получить файл по адресу

FILETOBASE64 загружает тело ответа как сырые байты и возвращает их в Base64.

Сохранить те же байты

HEXTOBASE64 и BASE64TOHEX меняют только печатное представление байтов, не пытаясь прочитать их как текст.

Текст, байты и печатное представление

Одна и та же видимая строка может означать разные данные. Перед выбором функции определите, что находится на входе.

Текст

Строка demo состоит из символов. Для передачи в двоичный формат сначала выбирается кодировка символов, обычно UTF-8.

Байты

В UTF-8 строка demo представлена байтами 64 65 6D 6F в шестнадцатеричной форме.

Base64

Те же четыре байта записываются как ZGVtbw==. Это печатная запись, из которой исходные байты восстанавливаются без потерь.

BASE64DECODE и BASEENCODEDECODE после восстановления байтов пытаются получить текст. BASE64TOHEX этого не делает: она сохраняет каждый байт и меняет только алфавит записи.

Простая пара Base64

BASE64

BASE64 выполняет вложенные значения и возвращает обычную строку Base64 с заполнением =.

(|BASE64|demo|BASE64|)

Результат:

ZGVtbw==

Функция использует историческое преобразование строк программы через системную кодировку ANSI. Для латиницы результат однозначен; для произвольного Unicode предпочтительнее BASEENCODEDECODE, где преобразование в UTF-8 задано явно.

Полный безопасный пример с промежуточной переменной:

#beginScript
|DV|[encoded] = (|BASE64|demo|BASE64|)
|DV|[decoded] = (|BASE64DECODE||DV|[encoded]|BASE64DECODE|)
#endScript

После выполнения |DV|[encoded] равно ZGVtbw==, а |DV|[decoded]demo. Основные алфавиты Base16, Base32 и Base64 определены в стандарте RFC 4648.

Значение строки JSON: ESCJSON

ESCJSON превращает произвольный текст во внутреннее содержимое строки JSON. Она экранирует кавычки, обратные косые черты, переводы строк, табуляцию и другие управляющие символы, но не добавляет внешние кавычки.

(|ESCJSON|Бренд "North Wind"|ESCJSON|)

Результат:

Бренд \"North Wind\"

Функцию нужно ставить внутрь уже существующих кавычек значения:

{
  "brand": "(|ESCJSON||PARS|[1]|ESCJSON|)",
  "inStock": true
}

Если |PARS|[1] равно Бренд "North Wind", после подстановки объект остаётся корректным JSON, а значение поля при разборе снова станет исходным текстом.

ESCJSON обрабатывает значение, а не весь объект

Не оборачивайте в функцию готовый JSON целиком: тогда служебные кавычки и скобки объекта превратятся в обычный текст. Для строки JavaScript существует отдельная функция JSESCAPE; её правила уже и не заменяют ESCJSON.

Значение в адресе: URLENCODE и URLDECODE

URLENCODE

URLENCODE преобразует текст в процентную запись для одного значения адреса. Пробел становится %20, а не +.

(|URLENCODE|q=Data Export&lang=ru|URLENCODE|)

Результат:

q%3DData%20Export%26lang%3Dru

Двоеточие, косая черта, вопросительный знак, #, & и = также кодируются. Поэтому передавайте значение параметра, а не готовый адрес целиком:

https://example.com/search?q=(|URLENCODE|Data Export|URLENCODE|)

Последовательности Unicode: UNICODEDECODE

UNICODEDECODE заменяет каждую последовательность \uXXXX соответствующим элементом UTF-16.

(|UNICODEDECODE|\u041f\u0440\u0438\u0432\u0435\u0442|UNICODEDECODE|)

Результат:

Привет

Символы за пределами основной многоязычной плоскости требуют правильной суррогатной пары:

(|UNICODEDECODE|🚀|UNICODEDECODE|)

Результат — 🚀. Неполные последовательности, неверные шестнадцатеричные цифры, одиночный верхний или нижний суррогат завершают выполнение явной ошибкой с позицией.

Чтобы оставить последовательность обычным текстом, удвойте обратную косую черту:

(|UNICODEDECODE|\\u041f|UNICODEDECODE|)

Результат — буквальный текст \u041f. Обратные косые черты перед другими буквами не изменяются.

Исправление ANSI-строки: ANSITOUTF8

ANSITOUTF8 предназначена для строки, которую прочитали через системную кодировку ANSI и из-за этого показали искажённо.

(|ANSITOUTF8|Êàòàëîã òîâàðîâ|ANSITOUTF8|)

На системе с русской кодовой страницей результат:

Каталог товаров

Преобразование зависит от текущей кодовой страницы Windows. Если полученная строка пуста или содержит знак замены , функция возвращает исходный текст вместо ошибки.

Это исправление известного искажения, а не выбор кодировки

Не применяйте ANSITOUTF8 ко всем ответам подряд и не передавайте ей произвольные байты. Используйте её только когда источник и системная кодовая страница известны, а видимое искажение подтверждено.

Файл по адресу: FILETOBASE64

FILETOBASE64 выполняет вложенные значения в адресе, отправляет запрос GET через текущую прокси и кодирует сырые байты тела ответа в Base64.

(|FILETOBASE64|https://example.com/|FILETOBASE64|)

Результатом будет одна строка Base64 с текущим содержимым ответа. Функция не пытается распознать изображение, архив или текст: одинаково обрабатываются любые байты.

Память

Сначала всё тело загружается в память, затем создаётся строка Base64 примерно на треть больше исходных данных. Для больших файлов выбирайте размер с учётом памяти одного выполнения.

Сеть

Используется текущая прокси проекта. Адрес должен вести прямо на нужный ответ; HTML-страница загрузки и сам файл дадут разные данные.

Постоянная сетевая ошибка может не вернуть управление

Текущий исполнитель повторяет транспортно неудачный запрос через одну секунду, но не увеличивает счётчик попыток. Пока ошибка сохраняется, вызов способен продолжать повторы без установленного предела. Проверяйте доступность адреса и прокси до массового запуска; строка результата не является надёжным способом дождаться такого сбоя.

HTTP-ответ с телом кодируется как получен. Если прикладной сервер вместо файла вернул страницу ошибки, её байты также могут стать корректной строкой Base64, поэтому проверяйте состояние сетевого запроса до вызова или используйте адрес с однозначным договором.

Между Base64 и шестнадцатеричной формой

Обе функции сохраняют байты и меняют только печатное представление.

HEXTOBASE64

(|HEXTOBASE64|A8|HEXTOBASE64|)

Результат:

qA==

Два шестнадцатеричных знака задают один байт, поэтому длина входа должна быть чётной. При нечётной длине функция возвращает строку Error: Invalid hex input: Length must be even.

Передавайте только 0–9, A–F или a–f. Исполнитель не проверяет число фактически преобразованных байтов после HexToBin, поэтому строка чётной длины с посторонним знаком может дать вводящий в заблуждение результат вместо явной ошибки.

Проверочная пара для нескольких байтов:

#beginScript
|DV|[asBase64] = (|HEXTOBASE64|64656D6F|HEXTOBASE64|)
|DV|[asHex] = (|BASE64TOHEX||DV|[asBase64]|BASE64TOHEX|)
#endScript

Результаты: |DV|[asBase64] равно ZGVtbw==, |DV|[asHex] равно 64656D6F.

Несколько алфавитов: BASEENCODEDECODE

BASEENCODEDECODE принимает один объект JSON, кодирует текст или декодирует печатную строку выбранным алгоритмом.

(|BASEENCODEDECODE|{"algorithm":"Base64","action":"encode","message":"demo"}|BASEENCODEDECODE|)

Результат:

ZGVtbw==

Поля объекта

algorithm

Обязательная строка с точным именем алгоритма. Регистр учитывается: Base64 допустимо, base64 — нет.

action

Обязательная строка encode или decode в нижнем регистре.

message

Обязательная строка с исходным текстом при кодировании или печатным представлением при декодировании.

usePadding

Необязательное логическое значение только для кодирования Base64. По умолчанию true; при false конечные знаки = удаляются.

customAlphabet

Необязательная строка для Base58Custom. Без непустого допустимого алфавита этот алгоритм не запускается.

Ключи, действия и имена алгоритмов чувствительны к регистру. Не заключайте логическое значение в кавычки:

(|BASEENCODEDECODE|{"algorithm":"Base64","action":"encode","message":"demo","usePadding":false}|BASEENCODEDECODE|)

Результат — ZGVtbw без ==.

Доступные алгоритмы

Base16, Base32, Base64

Стандартные алфавиты для текста и протоколов. Base16 выдаёт строчные шестнадцатеричные буквы. usePadding влияет только на кодирование Base64.

Base58BitCoin, Base58Ripple, Base58Flickr

Три разных фиксированных алфавита Base58. Они несовместимы между собой, поэтому имя варианта должно совпадать у отправителя и получателя.

Base58Custom

Использует customAlphabet. Передайте полный допустимый алфавит из 58 уникальных знаков и тот же алфавит при обратном преобразовании.

Ascii85 и Z85

Два разных алфавита Base85. Для Z85 число исходных байтов при кодировании кратно четырём, а длина закодированной строки при декодировании кратна пяти; это закреплено в спецификации Z85.

Значения из переменных

Весь объект сначала проходит обычные подстановки in-Line. Если значение может содержать кавычку, обратную косую черту или перевод строки, подготовьте его через ESCJSON:

(|BASEENCODEDECODE|{"algorithm":"Base64","action":"encode","message":"(|ESCJSON||PARS|[1]|ESCJSON|)"}|BASEENCODEDECODE|)

Без ESCJSON значение Товар "A" разорвёт кавычки объекта ещё до его разбора.

Обратное преобразование и ошибки

(|BASEENCODEDECODE|{"algorithm":"Base64","action":"decode","message":"ZGVtbw"}|BASEENCODEDECODE|)

Результат — demo: ветвь Base64 принимает форму для адресов и дополняет отсутствующие =.

После декодирования любого алгоритма байты читаются как UTF-8. Если исходные байты не являются корректным текстом UTF-8, результат нельзя использовать как надёжное двоичное значение; для сохранения байтов в другой печатной форме используйте BASE64TOHEX или HEXTOBASE64.

Ошибки возвращаются как обычный текст

Неверный JSON, отсутствующее поле, неподдерживаемый алгоритм, неверное действие, алфавит или размер данных возвращают строку с началом Error: . Функция перехватывает эти ошибки, поэтому непустой результат ещё не означает успех: отделяйте ожидаемый формат результата от строки ошибки.