README.md

Кодировка vc85 (base85vc)

Кодировка vc85 является разновидностью base85 (85-символьный chatset) и совместима с ASCII85

vc85 это улучшенный вариант кодировки ASCII85

Улучшение состоит в том, что в таблицу символов добавлены альтернативные варианты символов, которые работают так же, как и “основные” символы ascii85. Декодер vc85 является обратно-совместимым с ascii85 и может раскодировать как ascii85 кодировку, так и vc85.

Таблица символов vc85 составлена таким образом, что коды символов в utf-8 и cp1251 не пересекаются, и поэтому декодер оказывается способен декодировать все возможные варинаты base85 (в частности ascii85, vwx85 и vc85). Отличия между этими вариантами кодирования следующие:

  • ascii85 представляет собой 85 последовательных ASCII-символов от ! до u, что соответствует регулярному выражению [!-u]
  • vwx85 - аналогично ascii85, но содержит три замены “неудобных” символов: v вместо ", w вместо ', x вместо \
  • vc85 - в дополнение к заменам vwx85 содержит замену всех спец-символов на буквы кириллического алфавита, визуально отличающиеся от всех остальных символов таблицы. См. таблицу:

Charset

Что надо знать про base-85

Кодировка base85 кодирует группы по 4 байта в 5 символов, то есть более компактно, нежели base64 (которая кодирует группы по 3 байта в 4 символа).

Реализация этой кодировки достаточно проста на большинстве языков программированияю. Она оперирует 4-байтовыми группами, которые точно помещаются в 32-разрядные числа и поэтому легко обрабатываются (в отличие от чисел с более высокой разрядностью).

В принципе, кодировку base85 можно было бы использовать везде вместо base64, но этому мешает наличие спец.символов. Строку в кодировке ascii85 нельзя просто так “заключить в кавычки” и вставить, например, в код программы, потому что внутри такой строки могут оказаться и кавычки, и слэши, и это может создать проблемы.

Вариант vwx85 отчасти решает эту проблему - устраняет кавычки и обратные слэши из таблицы символов, поскольку именно от этих символов обычно возникают проблемы. В таком варианте кодировки эти данные можно без проблем включать практически куда угодно. Поскольку символы v,w, x в классическом варианте ascii85 никак не зайдествованы, такая замена выглядит вполне логичным способом решения множества проблем.

Символы z и y

Поскольку символы z и y исторически было принято использовать для кодирования 5 нулевых байтов и 5 пробелов соответствнно, декодер vc85 эти правила тоже поддерживает.

Префиксы-постфиксы

Поскольку в таблицах base85-символов не встречается тильда ~, она может быть использована как признак окончания закодированных данных. В полном варианте данные в кодировке base85 заключаются между <~ в начале и ~> в конце блока закодированных данных.

Текущая реализация раскодировщика vc85 при наличии префиксов/постфиксов обрезает по ним раскодированные данные. То есть, если в данных будет найдено <~, то все предшествующие этому данные будут отброшены. А также, если встретится ~>, то все последующие данные будут отброшены.

Пробельные символы

Пробелы и переводы строк игнорируются, они могут встречаться где угодно.

Представления в utf-8 и cp1251

Символы кириллицы, которыми дополнен charset vc85, могут быть представлены в utf-8, либо в cp1251 кодировках. Декодер понимает оба варианта. Отметим, что в cp1251 все символы представляются 1-байтовыми кодами, а в utf-8 кириллические символы представляются двухбайтовыми кодами (начинающимися либо на 208, либо на 209). В данной реализации, при декодировании utf-8, коды 208 и 209 удаляются, и таким образом декодируемые данные приводится к однобайтовой кодировке. Таким образом, не требуется никаких конвертаций между utf-8 и cp1251.

Использование (для PHP)

Для использования надо подключить один файл - vc85.php

Для кодирования данных используется статическая функция encode, для декодирования статическая функция decode.

Пример кода:

<?php
use dynoser\base85\vc85; // добавляем чтобы далее использовать короткое имя vc85

require_once 'src/vc85.php'; // подключаем файл вручную, если не используется автозагрузка. Указываем правильный путь.

vc85::init(3); // (опционально) инициализируем кодировщик на режим vc85. По умолчанию будет использован режим 2=vwx85.

$en = vc85::encode("Какие-нибудь данные"); // кодируем какие-нибудь данные в vc85

echo $en; // выводим что получилось

$de = vc85::decode($en); // раскодируем обратно в байтовую строку

Результат будет примерно такой: <~dДiэcdЩ7T6dwYИPлЯЮд9ZЭe3NШжagTdwV0ЩdЩRfъdъQAZ~>

Управление добавлением префиксов

Чтобы отключить или включить добавление <~~> в начале и конце:

vc85::$addPf = false; // false - не добавлять, true - добавлять. По умолчанию добавляются.

Управление разбивкой на строки

Чтобы кодировщик выводил результат в одну строку (без разделения) задаём 0, либо для разбивки на заданной ширине задаём число в статическую переменную $splitWidth:

vc85::$splitWidth = 0; // 0 - не разбивать на строки. По умолчанию 75, т.е. разбивает на строки шриной 75 символов.

Выбор режима кодирования

Для инициализации кодировщика на нужный charset, надо вызывать init с параметром. Варианты:

vc85::init(1); // кодировщик будет выводить данные в формате классического ASCII85
vc85::init(2); // (по умолчанию) - будет выводить формате vwx85 (заменяет `"` на `v`, `'` на `w`, `\` на `x`)
vc85::init(3); // vc85 (спецсимволы заменяются на кириллические символы в кодировке utf-8)
vc85::init(4); // то же самое, что 3, но кириллические символы представляются в кодировке cp1251
Описание

base85-кодировка, совместимая с ASCII85, но с добавлением символов кириллицы. Все символы визуально различны, что позволяет однозначно распознавать символы для ввода, например, с распечатки.

Конвейеры
0 успешных
0 с ошибкой