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 шт):
Внезапно, эта строка и так в кодировке была 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);
Вывод в консоль
МАО только вперёд
Чтобы ломать такие головоломки, разберитесь, что такое кодировки символов, и как они работают.