3

Вот тут есть вариант на руби:

string="ʾÓÙÕ‗Ý¹Ú Ë‗ÕÝ¯Û ´│õÔ│±ÝÞÚ ¯¸Þ¨¾ÔÓ¸ õÙ  ¾Ý│‗Óþ¾ ÐÔ│µ│±‗³ ´ÕÙ■±‗Û│Ô1 °‗."
puts string.encode("cp850").force_encoding("windows-1251").encode("utf-8")

Подскажите, пожалуйста, как реализовать это на python, желательно python3?

Kirode
  • 35
  • Если вдруг это строка из базы данных (mysql), то лучше нормально настроить параметры подключения к этой базе – andreymal Dec 03 '16 at 14:24
  • А если это просто строка из соседнего вопроса, то лучше дайте ваши собственные строки, ибо ответ для вашей конкретной задачи может и не подойти – andreymal Dec 03 '16 at 14:25
  • Строка:

    x = 'Å«ñú«Ô«ó¬á ¬ ''Start'' ßÑÓóÑÓá ¿¡ÔÑúÓᵿ¿. æÑÓóÑÓ ¿¡ÔÑúÓᵿ¿ ß«í¿ÓáÑÔß´ óÙ»«½¡¿Ôý ñÑ®ßÔó¿Ñ. äÑ®ßÔó¿´ »«½ýº«óáÔѽ´ ¡Ñ ÔÓÑíÒ¯Ôß´.'

    На сколько я понимаю это cp850, вывести ее желательно в cp866 или cp1251.

    Это строки системного лога windows, куда пишет приложение IBM, IIB. Только у него лог отображается "кроказябрами", остальные приложения информацию пишут корректно.

    – Kirode Dec 03 '16 at 14:55

2 Answers2

7
>>> string = "ʾÓÙÕ‗Ý¹Ú Ë‗ÕÝ¯Û ´│õÔ│±ÝÞÚ ¯¸Þ¨¾ÔÓ¸ õÙ ¾Ý│‗Óþ¾ ÐÔ│µ│±‗³ ´ÕÙ■±‗Û│Ô1 °‗."
>>> string.encode('cp850').decode('cp1251')
'Туалетный Утенок підвісний очищувач дл унітазу Свіжість пелюстків1 шт.'

UPD: для другой строки из комментария:

>>> x = 'Å«ñú«Ô«ó¬á ¬ Start ßÑÓóÑÓá ¿¡ÔÑúÓᵿ¿. æÑÓóÑÓ ¿¡ÔÑúÓᵿ¿ ß«í¿ÓáÑÔß´ óÙ»«½¡¿Ôý ñÑ®ßÔó¿Ñ. äÑ®ßÔó¿´ »«½ýº«óáÔѽ´ ¡Ñ ÔÓÑíÒ¯Ôß´.' 
>>> x.encode('cp850').decode('cp866')
'Подготовка к Start сервера интеграции. Сервер интеграции собирается выполнить действие. Действия пользователя не требуются.'

Правда, возможно, лучше рассмотреть полный путь от получения строки до её использования (где, как и зачем) для более точного ответа

andreymal
  • 13,178
  • string1 = "ʾÓÙÕ‗Ý¹Ú Ë‗ÕÝ¯Û ´│õÔ│±ÝÞÚ ¯¸Þ¨¾ÔÓ¸ õÙ ¾Ý│‗Óþ¾ ÐÔ│µ│±‗³ ´ÕÙ■±‗Û│Ô1 °‗." print(string1.encode('cp850').decode('cp1251'))

    UnicodeEncodeError: 'charmap' codec can't encode characters in position 0-8: character maps to

    – Kirode Dec 03 '16 at 14:50
  • Если это в консоли Windows, то там принтить надо хитро и я уже так не умею – andreymal Dec 03 '16 at 15:11
  • Спасибо. Через интерпретатор работает, но через консоль windows выходит ошибка, скрипт на руби при этом в консоль печатает нормально, вот пытаюсь разобраться как это работает в питоне. А если выводить в файл то проблем не должно быть? Проблемы только с консолью? – Kirode Dec 03 '16 at 15:24
  • На данный момент обсуждаю вопрос, если не получится настроить программу так что бы информация выводилась в другой кодировке, то буду писать скрипт, который будет брать информацию из лога и выводить в файл или консоль при этом перекодируя. – Kirode Dec 03 '16 at 15:29
  • По идее только с консолью, да. В файл оно прекрасно запишется в кодировке utf-8 автоматически, а как в консоль WIndows правильно печатать, может кто-нибудь другой подскажет – andreymal Dec 03 '16 at 16:30
  • @Kirode следует упомянуть что в реальных задачах вы должны исправить генерацию данных выше по течению, вместо попыток перекодирования позже. В частности, чтобы получить нормальный вывод в консоль (и вообще крайне рекомендуемая опция при работе с текстом) следует использовать Unicode (избегайте байты напрямую в консоль выводить) – jfs Dec 04 '16 at 04:44
  • @jfs если бы была возможность исправить проблему выше по течению, то так и сделали бы, но кодировка прописана в хардкоде, доступа к исходникам нету, поэтому приходится использовать костыли для нормального чтения логов. В любом случае, спасибо заинформацию. – Kirode Dec 04 '16 at 11:50
-1

Если изменить кодировку консоли на cp866, то для вывода в консоль у меня сработал такой вариант:

print(user_input.encode('cp850').decode('cp866').encode('utf-8').decode('utf-8'))

но вариант на руби работает без смены кодировки консоли, поэтому пытаюсь искать еще варианты.

Вариант на руби, работающий без смены кодировки:

puts string.encode("cp850").force_encoding("IBM866").encode("utf-8")
Nicolas Chabanovsky
  • 51,426
  • 87
  • 267
  • 507
Kirode
  • 35