python 3.0, как заставить print () выводить юникод? - PullRequest
18 голосов
/ 03 февраля 2009

Я работаю в WinXP 5.1.2600, пишу приложение на Python с китайским пиньинь, которое вовлекает меня в бесконечные проблемы Unicode. Переход на Python 3.0 решил многие из них. Но функция print () для вывода на консоль не поддерживает Unicode по какой-то странной причине. Вот маленькая программа.

print('sys.stdout encoding is "' + sys.stdout.encoding + '"')
str1 = 'lüelā'
print(str1)

Вывод (изменение угловых скобок на квадратные скобки для удобства чтения):

    sys.stdout encoding is "cp1252"
    Traceback (most recent call last):
      File "TestPrintEncoding.py", line 22, in [module]
        print(str1)
      File "C:\Python30\lib\io.py", line 1491, in write
        b = encoder.encode(s)
      File "C:\Python30\lib\encodings\cp1252.py", line 19, in encode
        return codecs.charmap_encode(input,self.errors,encoding_table)[0]
    UnicodeEncodeError: 'charmap' codec can't encode character '\u0101' 
    in position 4: character maps to [undefined]

Обратите внимание, что ü = \ xfc = 252 не доставляет проблем, так как это верхний ASCII. Но а = \ u0101 выходит за пределы 8 бит.

У кого-нибудь есть идеи, как изменить кодировку sys.stdout на utf-8? Помните, что Python 3.0 больше не использует модуль codecs, если я правильно понимаю документацию.


Извинения, я дал вам программу без преамбулы. Перед указанием 3 строк начинается следующее:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys

К сожалению, кодирование, указанное в строке «coding:», является кодированием исходного кода , а не вывода консоли. Но спасибо за ваши мысли!

Ответы [ 5 ]

15 голосов
/ 03 февраля 2009

В командной строке Windows (cmd.exe) не могут отображаться символы Юникода, которые вы используете, даже несмотря на то, что Python корректно обрабатывает их внутренне. Вам нужно использовать IDLE, Cygwin или другую программу, которая может корректно отображать Unicode.

Смотрите эту тему для полного объяснения: http://www.nabble.com/unable-to-print-Unicode-characters-in-Python-3-td21670662.html

12 голосов
/ 27 октября 2010

Вы можете попробовать изменить переменную окружения "PYTHONIOENCODING" на "utf_8". Я написал страницу в моем испытании с этой проблемой .

2 голосов
/ 19 февраля 2009

Проверьте вопрос и ответ здесь , я думаю, у них есть некоторые ценные подсказки. В частности, обратите внимание на setdefaultencoding в модуле sys, но также на тот факт, что вы, вероятно, не должны его использовать.

1 голос
/ 28 мая 2015

Вот грязный хак:

# works
import os
os.system("chcp 65001 &")
print("юникод")

Однако все ломает его:

  • простая заглушающая первая строка уже разбивает его:

    # doesn't work
    import os
    os.system("chcp 65001 >nul &")
    print("юникод")
    
  • проверка типа ОС ломает его:

    # doesn't work
    import os
    if os.name == "nt":
        os.system("chcp 65001 &")
    
    print("юникод")
    
  • он даже не работает в блоке if:

    # doesn't work
    import os
    if os.name == "nt":
        os.system("chcp 65001 &")
        print("юникод")
    

Но можно печатать с эхом cmd:

# works
import os
os.system("chcp 65001 & echo {0}".format("юникод"))

и вот простой способ сделать это кроссплатформенным:

# works

import os

def simple_cross_platrofm_print(obj):
    if os.name == "nt":
        os.system("chcp 65001 >nul & echo {0}".format(obj))
    else:
        print(obj)

simple_cross_platrofm_print("юникод")

но завершающая пустая строка окна echo не может быть подавлена.

1 голос
/ 09 апреля 2015

Проблема отображения символов Юникода в Python в Windows известна. Официального решения пока нет. Правильнее всего использовать winapi-функцию WriteConsoleW. Построить рабочее решение нетривиально, поскольку существуют другие связанные с этим проблемы. Тем не менее, я разработал пакет, который пытается исправить Python относительно этой проблемы. См. https://github.com/Drekin/win-unicode-console. Вы также можете прочитать более подробное объяснение проблемы. Пакет также находится на pypi (https://pypi.python.org/pypi/win_unicode_console) и может быть установлен с помощью pip.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...