Юникод Python в терминале Mac os X

Может ли кто-нибудь объяснить мне эту странную вещь:

Когда в оболочке python я набираю следующую кириллическую строку:

>>> print 'абвгд' абвгд 

но когда я печатаю:

 >>> print u'абвгд' Traceback (most recent call last): File "<stdin>", line 1, in <module> UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-9: ordinal not in range(128) 

Поскольку первый трэс вышел правильно, я считаю, что мой терминал OS X может представлять собой unicode, но, оказывается, он не может быть во втором случае. Зачем ?

6 Solutions collect form web for “Юникод Python в терминале Mac os X”

 >>> print 'абвгд' абвгд 

Когда вы вводите некоторые символы, ваш терминал решает, как эти символы представлены в приложении. Ваш терминал может предоставить символы приложениям, закодированным как utf-8, ISO-8859-5, или даже то, что понимает только ваш терминал. Python получает эти символы как некоторую последовательность байтов. Затем python выводит эти байты так, как они есть, и ваш терминал каким-то образом интерпретирует их для отображения символов. Поскольку ваш терминал обычно интерпретирует байты так же, как и раньше, он отображается, как вы его ввели.

 >>> u'абвгд' 

Здесь вы вводите некоторые символы, которые поступают на интерпретатор python в виде последовательности байтов, возможно, каким-то образом закодированным терминалом. С префиксом u python пытается преобразовать эти данные в unicode. Для этого python должен знать, какую кодировку использует ваш терминал. В вашем случае похоже, что Python догадывается, что кодирование ваших терминалов будет ASCII, но полученные данные не соответствуют этому, поэтому вы получаете ошибку кодирования.

Таким образом, прямой способ создания строк в юникоде в интерактивном сеансе будет таким:

 >>> us = 'абвгд'.decode('my-terminal-encoding') 

В файлах вы также можете указать кодировку файла со специальной линией режима:

 # -*- encoding: ISO-8859-5 -*- us = u'абвгд' 

Для других способов установки кодировки ввода по умолчанию вы можете посмотреть sys.setdefaultencoding(...) или sys.stdin.encoding .

Начиная с Python 2.6, вы можете использовать переменную окружения PYTHONIOENCODING чтобы сообщить Python, что ваш терминал поддерживает UTF-8. Самый простой способ сделать это постоянным – добавить следующую строку в свой файл ~/.bash_profile :

 export PYTHONIOENCODING=utf-8 

Terminal.app показывает вывод unicode из Python

В дополнение к тому, что ваш терминал OS X установлен в UTF-8, вы можете захотеть установить кодировку по умолчанию sys для python в UTF-8 или выше. Создайте файл в /Library/Python/2.5/site-packages именем sitecustomize.py . В этом файле поставьте:

 import sys sys.setdefaultencoding('utf-8') 

Метод setdefaultencoding доступен только модулю сайта и удаляется из пространства имен sys после завершения запуска . Таким образом, вам нужно будет запустить новый интерпретатор python, чтобы изменения вступили в силу. Вы можете проверить текущий sys.getdefaultencoding() умолчанию в любое время после запуска с помощью sys.getdefaultencoding() .

Если символы еще не юникод, и вам нужно их преобразовать, используйте метод decode для строки, чтобы декодировать текст из какой-либо другой кодировки в unicode … лучше указать, какая кодировка:

 s = 'абвгд'.decode('some_cyrillic_charset') # makes the string unicode print s.encode('utf-8') # transform the unicode into utf-8, then print it 

Кроме того, убедитесь, что для кодировки терминала установлено значение Unicode / UTF-8 (а не ascii, который, как представляется, является вашей настройкой):

http://www.rift.dk/news.php?item.7.6

Объект unicode должен быть закодирован, прежде чем он будет отображаться на некоторых консолях. Пытаться

 u'абвгд'.encode() 

вместо этого, чтобы закодировать unicode на строковый объект (скорее всего, используя utf8 в качестве кодировки по умолчанию, но зависит от вашей конфигурации python)

'абвгд' не является строкой unicode

u'абвгд 'является строкой unicode

Вы не можете печатать строки unicode без их кодирования. Когда вы имеете дело со строками в своем приложении, вы хотите удостовериться, что любой вход декодирован и любой вывод в кодировке. Таким образом, ваше приложение будет обрабатывать только строки unicode внутри и выводить строки в UTF8.

Для справки:

 >>> 'абвгд'.decode('utf8') == u'абвгд' >>> True 
  • Unicode или что в matplotlib?
  • Заменить новые строки в строке Unicode
  • UnicodeEncodeError: кодек ascii не может кодировать символ u '\ xe7' в позиции 17710: порядковый номер не в диапазоне (128)
  • Python 2.7 UnicodeDecodeError: кодек 'ascii' не может декодировать байт
  • Идентификатор имени ISO 8859-1 не декодируется
  • Как узнать номер / имя символа юникода в Python?
  • Нормализация Unicode
  • как разбить строку unicode на список
  • python: открыть и прочитать файл, содержащий germanic umlaut, как unicode
  • Python - лучший язык программирования в мире.