Получение оптимальной кодировки

Я хочу сохранить строку юзера(которую он введёт) в текстовый файл, но при этом использовать оптимальную кодировку. То есть сделать enum из кодировок, а потом в файл первым байтом записывать index enum'а, а далее уже саму строку в оптимальном кодировке, чтобы файл занимал минимальное количество байт


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

Автор решения: Alexander Petrov

Перебираем все имеющиеся кодировки.
Получаем массив байт из строки.
Проверяем, что обратное преобразование выполняется корректно.
Выбираем минимальный размер массива.

string s = "こんにちは";

// Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

var x = Encoding.GetEncodings()
    .Select(info => info.GetEncoding())
    .Select(enc => new { Encoding = enc, Bytes = enc.GetBytes(s) })
    .Where(x => x.Encoding.GetString(x.Bytes) == s)
    .MinBy(x => x.Bytes.Length);

Console.WriteLine(x.Encoding);

Теперь как-то сохраняем строку в файл.
x.Bytes уже содержит массив байтов в нужной кодировке. Можно использовать их напрямую.

По умолчанию в последних версиях дотнета подключено мало кодировок (только основные). Если нужны все, то раскомментируйте Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

Следует учитывать, что на разных компьютерах могут быть установлены разные кодировки. Поэтому не следует использовать редкие.

PS: Не забываем про BOM!

→ Ссылка