Юникод Python работает в 2.6.1 в OSX, но не в 2.6.5 в Ubuntu - PullRequest
3 голосов
/ 29 января 2011

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

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)
>>> 

Что-то изменилось между Python 2.6.1 и 2.6.5, что требует другой обработки строк Юникода?Или это связано с чем-то неправильно настроенным в моей среде Linux (по умолчанию на сервере Ubuntu 10.04 LTS)?

Редактировать: в обеих средах LANG = en_US.UTF-8

Ответы [ 3 ]

4 голосов
/ 29 января 2011

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

3 голосов
/ 29 января 2011

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

$ 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 голосов
/ 29 января 2011

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

my_string = u '\ xc3 \ xa9'

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...