Найти - Пользователи
Полная версия: subprocess и кодировки
Начало » Python для новичков » subprocess и кодировки
1
_alexs_
В своём коде вызываю стороннюю консольную утилиту при помощи 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)

Игрался с decode() и encode(), но без результатно. Может, подскажете как можно решить эту проблему?
py.user.next
_alexs_
Проблема в том, что кирилличиеские и прочие не-ASCII символы в моей программе отображаются
в нечитаемом виде.
Выводи список либо поэлементно, либо через u''.join(lst) .
_alexs_
Видимо не совсем ясно выразился, вывод многострочный, каждый элемент списка это одна строка. В первом сообщении как раз приведено содержимое одного элемента списка. Вот пример полного вывода
[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']
py.user.next
>>> 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Комора
>>>
_alexs_
Спасибо!

Я правильно понимаю, что тут мы просто отбрасываем лидирующие «мусорные» символы, чтобы получить utf-8?
py.user.next
_alexs_
тут мы просто отбрасываем лидирующие «мусорные» символы
Непонятно, откуда они появились, поэтому делается обратное действие.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB