Различные варианты кодировок в .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 проще.