C# Как установить конкретную кодировку строки?

У меня есть такая строка ╨Ь╨Р╨Ю ╤В╨╛╨╗╤М╨║╨╛ ╨▓╨┐╨╡╤А╤С╨┤

Мне нужно перевести ее в кодировку UTF-8 или любую другую, чтобы текст нормально отображался.

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

Этот сервис сообщает, что исходная кодировка - Windows-1251

Этот - IBM866.

Но так или иначе, они оба правильно декодировали строку.


Я пытался перевести ее в UTF-8:

Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
Encoding utf8 = Encoding.UTF8;
Encoding srcEncoding = Encoding.GetEncoding("IBM866");
byte[] srcBytes = srcEncoding.GetBytes(description);
byte[] resultBytes = Encoding.Convert(srcEncoding, utf8, srcBytes);
Console.WriteLine(utf8.GetString(resultBytes));

Выводит: (тоже самое)

╨Ь╨Р╨Ю ╤В╨╛╨╗╤М╨║╨╛ ╨▓╨┐╨╡╤А╤С╨┤

Тот же код, но с кодировкой Windows-1251

Encoding srcEncoding = Encoding.GetEncoding("Windows-1251");

Выводит это:

│Ь│Р│Ю TВ│-│┐TМ│││- │-│┐││TАTС│+

Как мне в таком случае получить нормальную строку?


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

Автор решения: aepot

Внезапно, эта строка и так в кодировке была UTF-8, только вот вы ее прочитали с помощью кодировки DOS Codepage-866. Как вам это удалось - не знаю.

Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
// берем символы, полученные с помощью какой-то неизвестной кодировки
// предполагается, что это какая-то двухбайтовая кодировка, а для раскодировки использовалась однобайтовая
string a = "╨Ь╨Р╨Ю ╤В╨╛╨╗╤М╨║╨╛ ╨▓╨┐╨╡╤А╤С╨┤"; 
// предполагаем, что раскодировано с помощью DOS CP866, закодируем обратно
byte[] bytes = Encoding.GetEncoding("CP866").GetBytes(a);
// предполагаем по характерным двухбайтовым артефактам, что это не английский язык
// а например русский, русские символы в UTF-8 кодируются двумя байтами.
string b = Encoding.UTF8.GetString(bytes);
Console.WriteLine(b);

Вывод в консоль

МАО только вперёд

Чтобы ломать такие головоломки, разберитесь, что такое кодировки символов, и как они работают.

→ Ссылка