1. У меня такая проблема. Использую консоль виндовс cmd.exe, если выводить в нее текст в юникоде через print то все в порядке.
    print u'Привет'
    Насколько я знаю, оператор print пытается самостоятельно перекодировать текст в кодировку текущего stdout'a, в моем случае cp886.

    А вот при возбуждении исключений выходит такой косяк.
    >>> raise TypeError(u'Привет')
    Traceback (most recent call last):
    File "<console>", line 1, in <module>
    TypeError: <unprintable TypeError object>
    Как это понимать? Исключения не поддерживают юникод? O_o
  2. TypeError: unprintable TypeError object

  3. Иван Сагалаев

    02.01.2010

    0 ↑
    0 ↓

    Насколько я знаю, оператор print пытается самостоятельно перекодировать текст в кодировку текущего stdout'a

    Он не знает кодировки текущего stdout'а. В консоли он берёт кодировку из локали, если я правильно помню. Но вообще, доверять этому неявному поведению не стоит. Если надо что-то выводить, надо сначала явно привести это к байтам.

    Исключения не поддерживают юникод? O_o

    Можно сказать и так. Это уши всё той же проблемы, что и со всем юникодом в Питоне: по умолчанию кодировка перевода из юникода в байты — us-ascii.

  4. Я писал небольшую библиотечку под Ubuntu, там консоль была юникодная и все выводилось без проблем. Теперь запускаю под виндовс и вот засада...
    Значит буду переписывать исключения на английский.
    Спасибо.
  5. Так:

    raise TypeError(u'Привет'.encode('cp866'))
    

    не помогает?

  6. Это костыль получается.
  7. А задекорировать TypeError таким образом, чтобы она сам кодировал юникодные строчки?

    Тоже костыль, но более симпатичный и безболезненный...

  8. Мне уже все равно что выводится в консоль. Теперь я все сообщения пишу в лог файл. Практично и сердито.

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.