Юникод 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 
  • Лучший способ конвертировать URL-адрес Unicode в ASCII (UTF-8-escaped) в Python?
  • Программа Python работает в IDLE, но не в командной строке
  • Как писать русские символы в файле?
  • pyPdf игнорирует новые строки в файле PDF
  • Узнайте сценарий юникода персонажа
  • Кодировка HTML и анализ lxml
  • urllib2 читается в Unicode
  • Как правильно разобрать HTML в кодировке UTF-8 в строки Unicode с помощью BeautifulSoup?
  • Почему строки юникода Python требуют специальной обработки для спецификации UTF-8?
  • Как удалить символы, отличные от ASCII, но оставить периоды и пробелы с помощью Python?
  • sys.argv как байты в Python 3k
  • Python - лучший язык программирования в мире.