#python #unicode #ipython #anaconda
#python #юникод #ipython #анаконда
Вопрос:
Я использую python 2.7.12 от anaconda в Windows 10. В дистрибутив включен ipython 5.1.0. Я написал программу для печати определенных столбцов запрошенных строк в базе данных mysql. Столбцы содержат строки в юникоде. При запуске программы на python генерируется исключение, когда впервые появляется символ Юникода в одной из строк. Работает та же программа в ipython, отображая все символы соответствующим образом.
Я выделил проблему в отдельную небольшую программу следующим образом:
name = u'Ou2019Connor'
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'
При запуске с использованием python каждый раз генерируются исключения. При запуске в ipython работают все три оператора печати. Очевидно, что между двумя версиями существует разница в способе обработки Юникода. В чем разница и что я должен сделать, чтобы моя программа выполнялась в любой среде?
Комментарии:
1. Каковы исключения?
2. Сгенерированный запущенный python: File «C:Anaconda2libencodingscp437.py «, строка 12, в кодировке кодек возврата.charmap_encode(ввод, ошибки, encoding_map) Ошибка UnicodeEncodeError: кодек ‘charmap’ не может кодировать символ u’u2019′ в позиции 1: символ сопоставляется с <неопределенным>
3. Проблема, вероятно, в том, что python пытается печатать с использованием кодека, который нельзя преобразовать из юникода, в то время как ipython печатает юникод напрямую.
Ответ №1:
Похоже, что ipython использует нормальную кодировку вывода по умолчанию (вероятно, UTF-8 или UTF-16), в то время как обычный Python использует cp437
ограниченный надмножество ASCII с одним байтом на символ, которое не может представлять весь диапазон Unicode.
Если вы можете управлять командной строкой, вы можете запустить chcp 65001
перед запуском Python, чтобы заставить его использовать «кодовую страницу» для UTF-8 (которую Python должен подобрать). Возможно, вы захотите установить это значение по умолчанию для командных подсказок в целом, чтобы избежать проблем в будущем.
Комментарии:
1. Я бы НЕ РЕКОМЕНДОВАЛ устанавливать консоль на кодовую страницу 65001 для Python или любой другой среды, использующей стандартную библиотеку C для ввода-вывода. Существуют серьезные ошибки в обработке консолью этой кодовой страницы (и других многобайтовых кодовых страниц, которые явно не поддерживаются как DBCS по умолчанию для локали). Скорее всего, вы получите искаженный и повторяющийся вывод, а также пропущенный ввод или зависания при попытке использовать символы, отличные от ASCII. Python 3.6, наконец, решает эти проблемы, но до тех пор командная строка Windows просто не работает, и вы мало что можете с этим поделать.
2. Начиная с IPython 5, IPython использует win_unicode_console для вывода символов Юникода на консоль. Это похоже на функциональность, интегрированную в Python 3.6.