Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 6, 2016 11:41:42

_alexs_
Зарегистрирован: 2012-04-02
Сообщения: 42
Репутация: +  0  -
Профиль   Отправить e-mail  

subprocess и кодировки

В своём коде вызываю стороннюю консольную утилиту при помощи 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(), но без результатно. Может, подскажете как можно решить эту проблему?

Офлайн

#2 Июнь 6, 2016 11:52:59

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10010
Репутация: +  857  -
Профиль   Отправить e-mail  

subprocess и кодировки

_alexs_
Проблема в том, что кирилличиеские и прочие не-ASCII символы в моей программе отображаются
в нечитаемом виде.
Выводи список либо поэлементно, либо через u''.join(lst) .



Отредактировано py.user.next (Июнь 6, 2016 11:53:11)

Офлайн

#3 Июнь 6, 2016 12:23:47

_alexs_
Зарегистрирован: 2012-04-02
Сообщения: 42
Репутация: +  0  -
Профиль   Отправить e-mail  

subprocess и кодировки

Видимо не совсем ясно выразился, вывод многострочный, каждый элемент списка это одна строка. В первом сообщении как раз приведено содержимое одного элемента списка. Вот пример полного вывода

[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)

Офлайн

#4 Июнь 6, 2016 12:48:53

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10010
Репутация: +  857  -
Профиль   Отправить e-mail  

subprocess и кодировки

>>> 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Комора
>>>



Офлайн

#5 Июнь 7, 2016 13:48:38

_alexs_
Зарегистрирован: 2012-04-02
Сообщения: 42
Репутация: +  0  -
Профиль   Отправить e-mail  

subprocess и кодировки

Спасибо!

Я правильно понимаю, что тут мы просто отбрасываем лидирующие «мусорные» символы, чтобы получить utf-8?

Офлайн

#6 Июнь 7, 2016 13:57:22

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10010
Репутация: +  857  -
Профиль   Отправить e-mail  

subprocess и кодировки

_alexs_
тут мы просто отбрасываем лидирующие «мусорные» символы
Непонятно, откуда они появились, поэтому делается обратное действие.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version