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 с ошибкой