2011-01-29 1 views
3

Учитывая следующий код запуска из интерпретатора Python:Python Юникода работает в 2.6.1 на OSX, но не в 2.6.5 на Ubuntu

import sys 
sys.getdefaultencoding() 
my_string = '\xc3\xa9' 
my_string = unicode(my_string, 'utf-8') 
my_string 
print my_string 

С Python 2.6.1 работает на Mac, все работает штраф:

$ python 
Python 2.6.1 (r261:67515, Jun 24 2010, 21:47:49) 
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import sys 
>>> sys.getdefaultencoding() 
'ascii' 
>>> my_string = '\xc3\xa9' 
>>> my_string = unicode(my_string, 'utf-8') 
>>> my_string 
u'\xe9' 
>>> print my_string 
é 
>>> 

С Python 2.6.5 работает на Ubuntu 10.04 LTS, он не:

$ python 
Python 2.6.5 (r265:79063, Apr 16 2010, 13:57:41) 
[GCC 4.4.3] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import sys 
>>> sys.getdefaultencoding() 
'ascii' 
>>> my_string = '\xc3\xa9' 
>>> my_string = unicode(my_string, 'utf-8') 
>>> my_string 
u'\xe9' 
>>> print my_string 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 0: ordinal not in range(128) 
>>> 

что-то изменилось между Py thon 2.6.1 и 2.6.5, которые требуют различной обработки строк Unicode? Или это связано с чем-то неправильно сконфигурированным в моей (по умолчанию Ubuntu server 10.04 LTS) среде linux?

Редактировать: Обе среды имеют ЛАНГ = en_US.UTF-8

+0

Забавная история, хотя вопрос был о 'Python Unicorn' –

+0

Какой эмулятор терминала вы используете под Ubuntu? – unutbu

+0

Я не уверен. Я использую ssh из терминала в моем mac. Сервер безголовый, работает на Rackspace, и я установил его с минимальными материалами (в основном apache и pylons). – Karl

ответ

3

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

$ PYTHONIOENCODING=ascii python -c'print "\xc3\xa9".decode("utf-8")' 
Traceback (most recent call last): 
    File "", line 1, in 
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 0:\ 
ordinal not in range(128) 

sys.getdefaultencoding() является 'ascii' и не очень полезно по умолчанию.

Попробуйте использовать консоль кодирования:

$ PYTHONIOENCODING=utf-8 python -c'print "\xc3\xa9".decode("utf-8")' 
é 

или

$ python -c'import locale; print "\xc3\xa9".decode("utf-8").encode(
> locale.getpreferredencoding())' 
é 

Проверить sys.stdout.encoding:

$ python -c'import sys; o = sys.stdout; print o.isatty(), o.encoding' 
True UTF-8 

$ python -c'import sys; o = sys.stdout; print o.isatty(), o.encoding' | cat 
False None 

$ python -c'import sys; o = sys.stdout; print o.isatty(), o.encoding' >/tmp/out 
$ cat /tmp/out 
False None 

Если sys.stdout.encoding является None попытаться использовать locale.getpreferredencoding() или установить PYTHONIOENCODING, как показано выше. См. http://wiki.python.org/moin/PrintFails

Если ошибка возникает только в интерактивной сессии Python, посмотрите на sys.displayhook().

+0

PYTHONENCODING сделал трюк. Но теперь, как мне исправить терминал в ubuntu? Это мини-библиотека, компоненты которой будут вызываться через команды оболочки и через скрипт cronjob. Перепутанный терминал - это в основном сеанс ssh от моего mac (который работает) на безголовый сервер ubuntu (который не работает, если я не задал переменную окружения). Я думал, что ubuntu по умолчанию был unicode, а LANG уже en_US.UTF-8. – Karl

+1

Ничего. Устанавливаемая по умолчанию установка ubuntu не имеет/etc/default/locale. Как только я создал это с помощью en_US.UTF-8, он сработал. – Karl

4

Это может произойти с C языка. Попробуйте запустить Python с LANG=en_US.UTF-8 python и повторите попытку кода.

+2

+1 Кроме того, нестандартный юникод может быть освобожден только из-за особых обстоятельств. – 9000

+0

О, да, извините, забыл упомянуть об этом. В обеих средах LANG = en_US.UTF-8 – Karl

0

Вы пробовали префикс вашей строки с помощью u?

my_string = и '\ xc3 \ xÀ9'

См http://docs.python.org/howto/unicode.html#unicode-literals-in-python-source-code

В исходном коде Python, Unicode литералы записываются в виде строк с префиксом 'и' или ' U ' персонаж: u'abcdefghijk'. Конкретные кодовые точки могут быть записаны с помощью управляющей последовательности \ u, которая сопровождается четырьмя шестнадцатеричными цифрами с кодом . Последовательность выхода \ U является подобное, но ожидает 8 шестнадцатеричных цифр, не 4.

+1

Не это, потому что закодированная байтовая последовательность (которая впоследствии декодируется) является желаемой. –

Смежные вопросы