Форум сайта python.su
0
В своём коде вызываю стороннюю консольную утилиту при помощи subprocess, затем считываю её вывод и отображаю в своей программе. Проблема в том, что кирилличиеские и прочие не-ASCII символы в моей программе отображаются
в нечитаемом виде.
Если утилиту запускать напрямую — все замечательно, кириллица и прочие символы на месте. Вывод выхлопа утилиты посредством print даёт примерно такой результат
u'\uffd0\uffa5\uffd0\uffbe\uffd0\uffb4\uffd0\uffbe\uffd1\uff80\uffd0\uffba\uffd0\uffbe\uffd0\uffb2\uffd1\uff81\uffd0\uffba\uffd0\uffbe\uffd0\uffb3\uffd0\uffbe'
proc = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stdin=subprocess.PIPE,stderr=subprocess.STDOUT, universal_newlines=True) for line in iter(proc.stdout.readline, ""): line = line.strip("\n") output.append(line)
Офлайн
857
_alexs_Выводи список либо поэлементно, либо через u''.join(lst) .
Проблема в том, что кирилличиеские и прочие не-ASCII символы в моей программе отображаются
в нечитаемом виде.
Отредактировано py.user.next (Июнь 6, 2016 11:53:11)
Офлайн
0
Видимо не совсем ясно выразился, вывод многострочный, каждый элемент списка это одна строка. В первом сообщении как раз приведено содержимое одного элемента списка. Вот пример полного вывода
[u'\uffd0\uffa5\uffd0\uffbe\uffd0\uffb4\uffd0\uffbe\uffd1\uff80\uffd0\uffba\uffd0\uffbe\uffd0\uffb2\uffd1\uff81\uffd0\uffba\uffd0\uffbe\uffd0\uffb3\uffd0\uffbe', u'238585042', u'\uffd0\uff9a\uffd0\uffbe\uffd0\uffbc\uffd0\uffbe\uffd1\uff80\uffd0\uffb0']
Отредактировано _alexs_ (Июнь 6, 2016 12:24:01)
Офлайн
857
>>> def tr(s): ... return str(bytearray(ord(i) % 0xff for i in s)) ... >>> lst = [u'\uffd0\uffa5\uffd0\uffbe\uffd0\uffb4\uffd0' ... u'\uffbe\uffd1\uff80\uffd0\uffba\uffd0\uffbe' ... u'\uffd0\uffb2\uffd1\uff81\uffd0\uffba\uffd0' ... u'\uffbe\uffd0\uffb3\uffd0\uffbe', ... u'238585042', ... u'\uffd0\uff9a\uffd0\uffbe\uffd0\uffbc\uffd0' ... u'\uffbe\uffd1\uff80\uffd0\uffb0'] >>> >>> lst = map(tr, lst) >>> out = ''.join(lst) >>> >>> print out Ходорковского238585042Комора >>>
Офлайн
0
Спасибо!
Я правильно понимаю, что тут мы просто отбрасываем лидирующие «мусорные» символы, чтобы получить utf-8?
Офлайн
857
_alexs_Непонятно, откуда они появились, поэтому делается обратное действие.
тут мы просто отбрасываем лидирующие «мусорные» символы
Офлайн