Отображение кириллических символов в питоне

Допустим, у меня есть контент на русском языке в переменной:

msg = '<some russian text here>'
print msg 

дает мне правильное значение, но

print [msg]

дает мне это:

['\xd0\x9f\xd0\xa4 "\xd0\x9a\xd0\xa2\xd0\x9f-\xd0\xa3\xd1\x80\xd0\xb0\xd0\xbb" (\xd0\x97\xd0\x90\xd0\x9e)']

Как сохранить кириллические символы в списке?


person zjor    schedule 17.04.2014    source источник
comment
Контейнеры Python используют repr() для представления содержащихся значений; вывод предназначен только для целей отладки. Вы должны создавать этот вывод с ' кавычками и квадратными скобками для объекта списка?   -  person Martijn Pieters    schedule 17.04.2014
comment
@qarma: но это не значение Юникода. Это строка байтов.   -  person Martijn Pieters    schedule 17.04.2014
comment
Подробности @MartijnPieters! Я говорю о том, чего хочет ОП, а не о том, о чем он просит: P   -  person Dima Tisnek    schedule 17.04.2014
comment
@qarma: вам нужно решить эту проблему в своем сообщении, поскольку решение, на которое вы ссылаетесь, работает только для unicode объектов.   -  person Martijn Pieters    schedule 17.04.2014
comment
@zjor, на какую версию Python вы ориентируетесь?   -  person Dima Tisnek    schedule 17.04.2014


Ответы (1)


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

Пример кода находится в https://stackoverflow.com/a/10883893/705086.

Он охватывает только тип Unicode, но может быть легко адаптирован к закодированным в utf-8 str/bytes, как в OP.

В идеале pprint должен поддерживать инвариант, что форматированный/печатный PDO является допустимым выражением Python. Связанный код также можно взломать, чтобы сохранить этот инвариант.

Вы можете использовать модуль monkey-path pprint для поддержания этого инварианта:

import functools, pprint

def escape(s):
    lead = ""
    if isinstance(s, unicode):
        s = s.encode("utf-8")
        lead = "u"
    return "%s\"%s\"" % (lead, s.replace("\\", "\\\\").replace("\"", "\\\""))

def patched(f):
    if hasattr(f, "_already_patched"):
        return f

    @functools.wraps(f)
    def sub(object, *args, **kwargs):
        try:
            if isinstance(object, basestring):
                return escape(object), True, False
        except Exception:
            pass
        return f(object, *args, **kwargs)

    sub._already_patched = True
    return sub

pprint._safe_repr = patched(pprint._safe_repr)

pprint.pprint([u"\N{EURO SIGN}", u"\N{EURO SIGN}".encode("utf-8")])
[u"€", "€"]
person Dima Tisnek    schedule 17.04.2014