Кодировка 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 содержит замену всех спец-символов на буквы кириллического алфавита, визуально отличающиеся от всех остальных символов таблицы. См. таблицу:
Что надо знать про 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, но с добавлением символов кириллицы. Все символы визуально различны, что позволяет однозначно распознавать символы для ввода, например, с распечатки.