Различные варианты кодировок в .Net Core

В процессе работы над библиотекой для парсинга транспортных потоков DVB столкнулся со следующей проблемой. в некоторых дескрипторах и таблицах для кодирования текста используются следующие кодировки:

             "iso-8859-1",
             "iso-8859-2",
             "iso-8859-3",
             "iso-8859-4",
             "iso-8859-5",
             "iso-8859-6",
             "iso-8859-7",
             "iso-8859-8",
             "iso-8859-9",
             "iso-8859-10",
             "iso-8859-11",
             "iso-8859-13",
             "iso-8859-14",
             "iso-8859-15",
             "iso-10646",
             "KSX1001-2004",
             "GB-2312-1980",
             "Big5",
             "UTF-8" // ETSI EN 300 468 Annex A2

Здесь и далее один байт интерпретируется как один символ. Ранее либа была написана под .net 4.5 и большая часть этих кодировок можно было достать так:

Encoding enc = Encoding.GetEncoding("iso-8859-5") и тд

Теперь большая кодировок не поддерживается, как я понял... https://docs.microsoft.com/en-us/dotnet/api/system.text.encodinginfo.getencoding?view=net-6.0

В принципе я решил проблему так:

 public static readonly Dictionary<byte, ushort> iso8859_5 = new Dictionary<byte, ushort>()
    {
        {0x00,0x0000},
        {0x01,0x0001},
        {0x02,0x0002},
        {0x03,0x0003},
        {0x04,0x0004},
        {0x05,0x0005},
        {0x06,0x0006},
        {0x07,0x0007},
        {0x08,0x0008},
        {0x09,0x0009},
        {0x0A,0x000A},
        ......

Нашёл таблицы https://www.unicode.org/Public/MAPPINGS/ISO8859/8859-5.TXT соответствия символов из этих таблиц символам юникода и сделал словари под эти кодовые таблицы

Далее следующий метод возвращает строку:

private static string BuildString(ReadOnlySpan<byte> bytes)
    {
        char[] chars = new char[bytes.Length];

        for(int i= 0; i < chars.Length; i++)
        {
            chars[i] = Convert.ToChar(iso8859_5[bytes[i]]);
        }

        return new string(chars);
    }

Вопрос. Существует ли более элегантное решение?

ps уж очень велико было желание сделать решение с рунами Golang like, но думаю с char проще.


Ответы (0 шт):