#c_sharp #net #windows #encoding
В общем, на работе стоит русская Windows 7, а дома английский Windows 10, так вот на работе с кодировками проблем нету, а дома какие-то кракозябры. Попробовал вот таким способом подобрать нужную кодировку, но не получилось: string srcStr = "êàíäèäàò"; string pattern = "кандидат"; foreach (var src in Encoding.GetEncodings()) { foreach (var dst in Encoding.GetEncodings()) { var tmp = dst.GetEncoding() .GetString(Encoding.Convert(src.GetEncoding(), dst.GetEncoding(), src.GetEncoding().GetBytes(srcStr))); if (tmp== pattern) { Console.WriteLine($"{src.CodePage}=>{dst.CodePage}"); } } } Хотя вот этот сайт четко определяет нужную кодировку http://www.online-decoder.com/ru Однако, когда я пытаюсь воспользоваться явно, то опять получаю кракозябры. Подскажи, в чем мой косяк? Может быть в настройках Win что-нибудь поменять нужно? В домашней ОС стоит русская локаль для программ без Unicode. Вообще на работе вот такая строчка работает: currentText = Encoding.UTF8.GetString(Encoding.Convert(Encoding.Default, Encoding.UTF8, Encoding.Default.GetBytes(currentText))); а вот дома каракули на выходе. Хм... А вот если так, то кодировка нормально подбирается: string srcStr = "êàíäèäàò"; string pattern = "кандидат"; foreach (var src in Encoding.GetEncodings()) { foreach (var dst in Encoding.GetEncodings()) { var dstBytes = src.GetEncoding().GetBytes(srcStr); var tmp = dst.GetEncoding().GetString(dstBytes); if (tmp == pattern) { Console.WriteLine($"{src.DisplayName}=>{dst.DisplayName}"); } } } Разве первый вариант не идентичный последнему варианту?
Ответы
Ответ 1
Ваши варианты неидентичны. Логика второго понятна: мы из байтов получили неправильную строку, интерпретируя их в неправильной кодировке. Мы получаем эти байты назад, и интерпретируем в правильной кодировке. При этом, понятно, байты не меняются, потому что это по сути одни и те же байты, мы лишь меняем их интерпретацию. А ваш первый вариант меняет байты при помощи Convert, понятно, что он не равносилен второму. Метод Convert работает наоборот: он берёт байты, соответствующие строке в одной кодировке, и превращает их в байты той же строки в другой кодировке. То есть var bytes2 = Encoding.Convert(enc1, enc2, bytes); равносильно var s = enc1.GetString(bytes); var bytes2 = enc2.GetBytes(s); Итого: Convert даёт байты другой кодировки для той же строки, а второй вариант даёт другую строку для тех же байтов.
Комментариев нет:
Отправить комментарий