2016-10-14 2 views
1

Я запускаю python 2.7.12 из anaconda на windows 10. В дистрибутив входит ipython 5.1.0. Я написал программу для печати определенных столбцов запрашиваемых строк в базе данных mysql. Столбцы содержат строки в юникоде. Когда программа запускается в python, возникает исключение, когда вначале отображается символ Юникода в одной из строк. Эта же программа в ipython работает, отображая все символы соответствующим образом.python и ipython по-видимому обрабатывают символы unicode по-разному

Я дистиллированный вопрос в отдельную маленькую программу выглядит следующим образом:

name = u'O\u2019Connor' 
try: 
    print name 
except: 
    print "exception 1 thrown" 

try: 
    print u"{}".format(name) 
except: 
    print "exception 2 thrown" 

try: 
    print u"%s" % name 
except: 
    print 'exception 3 thrown' 

При запуске с помощью питона, исключения выбрасываются каждый раз. При запуске в ipython работают все три оператора печати. Очевидно, что существует разница между двумя версиями в способе обработки unicode. В чем разница и что мне делать, чтобы моя программа работала в любой среде?

+0

Зачем? – Ouroborus

+0

Сгенерированный запущенный python: Файл «C: \ Anaconda2 \ lib \ encodings \ cp437.py», строка 12, в кодировке return codecs.charmap_encode (вход, ошибки, encoding_map) UnicodeEncodeError: кодек charmap не может кодировать символ u '\ u2019' в позиции 1: карты символов до sizzzzlerz

+0

Проблема в том, что python пытается печатать с использованием кодека, который не может быть преобразован из юникода, в то время как ipython печатает unicode напрямую. – Ouroborus

ответ

0

Похоже, что ipython использует стандартную выходную кодировку по умолчанию (возможно, UTF-8 или UTF-16), в то время как простой Python использует cp437, ограниченное однобайтовое ASCII-надмножество, которое не может представлять целое Unicode.

Если вы можете управлять командной строкой, вы можете запустить chcp 65001 перед запуском Python, чтобы он использовал «кодовую страницу» для UTF-8 (которую должен занять Python). Возможно, вы захотите сделать это the default for command prompts in general to avoid future problems.

+0

Я бы ** НЕ РЕКОМЕНДУЕТ ** установить консоль на кодовую страницу 65001, для Python или любой другой среды, которая использует стандартную библиотеку C для ввода-вывода. Существуют серьезные ошибки в обработке консоли этой кодовой страницы (и других многобайтовых кодовых страниц, которые явно не поддерживаются как DBCS по умолчанию). Вероятно, вы получите искаженный и повторяющийся вывод, а также отсутствие ввода или зависания, чтобы использовать символы, отличные от ASCII. Python 3.6, наконец, работает над этими проблемами, но до тех пор командная строка Windows просто сломана, и вы не можете много сделать. – bobince

+1

Начиная с IPython 5, IPython использует [win_unicode_console] (https://pypi.python.org/pypi/win_unicode_console) для печати символов Unicode на консоли. Это похоже на функциональность, интегрированную в Python 3.6. –