Пользовательская кодировка в. net - PullRequest
0 голосов
/ 14 января 2020

Я искал любые примеры пользовательского кодирования в. net. Скажем, если я хочу реализовать roman8

https://www.compart.com/en/unicode/charsets/hp-roman8

кодирование / декодирование in. net, как мне это сделать? В ореховой оболочке я знаю, что нам нужно наследовать от системного класса Encoding и реализовывать наши собственные методы кодирования / декодирования, но без примеров это выглядит сложно. Есть один пример, который я могу видеть из JonSkeet , но он слишком стар, чтобы следовать по моему мнению.

{ ссылка }.

Любая помощь будет оценена. Спасибо!

1 Ответ

1 голос
/ 14 января 2020

Теперь, когда Net является открытым исходным кодом, вы можете просмотреть исходный код кодировок, включенных в платформу.

Похоже, что реализации Unicode используют interop для вызова некоторого нативного кода для выполнения фактического работают, но есть некоторые, которые полностью реализованы в C#, такие как ISCIIEnocding

Вот источник: https://referencesource.microsoft.com/#mscorlib / system / text / isciiencoding.cs


Чтобы создать реализацию для новой кодировки, вам необходимо создать подкласс System.Text.Encoding и реализовать следующие методы. Я предполагаю, что вы используете простую кодировку 1: 1, например, roman8, если не все будет немного сложнее!

GetByteCount() и GetCharCount() оба возвращают количество байтов / символов, введенных на входе будет производить. В этом случае мы можем просто вернуть длину входного массива.

GetMaxByteCount() и GetMaxCharCount похожи, но возвращают теоретическое максимальное количество элементов, которое может быть возвращено для данного ввода. Еще раз, мы можем просто вернуть ту же длину.

Чтобы выполнить фактическое преобразование, будут вызваны эти методы. Базовый класс Encoding позаботится о создании массивов для вас, вам просто нужно заполнить вывод правильными значениями.

    public override int GetBytes(char[] chars, int charIndex, int charCount, byte[] bytes, int byteIndex)
    {
        for (var i = 0; i < charCount; i++) 
        {
            bytes[byteIndex + i] = GetByte(chars[charIndex + i]);
        }
        return charCount;
    }

Где GetByte() - это простой метод для поиска индекса символ в вашем массиве.

    public override int GetChars(byte[] bytes, int byteIndex, int byteCount, char[] chars, int charIndex)
    {
        for (var i = 0; i < byteCount; i++) 
        {
            chars[charIndex + i] = conversionArray[bytes[byteIndex + i]];
        }
        return byteCount;
    }

Заполните conversionArray вашими символами с правильным индексом для кодировки.

См. https://dotnetfiddle.net/eBvgc6 для рабочего примера .

...