Python: Використання .format () у рядку, уникнутому Unicode


156

Я використовую Python 2.6.5. Мій код вимагає використання знака "більше або рівний". Ось це іде:

>>> s = u'\u2265'
>>> print s
>>> 
>>> print "{0}".format(s)
Traceback (most recent call last):
     File "<input>", line 1, in <module> 
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2265'
  in position 0: ordinal not in range(128)`  

Чому я отримую цю помилку? Чи є правильний спосіб зробити це? Мені потрібно використовувати .format()функцію.

Відповіді:


243

Просто зробіть другу рядок також рядком unicode

>>> s = u'\u2265'
>>> print s

>>> print "{0}".format(s)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2265' in position 0: ordinal not in range(128)
>>> print u"{0}".format(s)
≥
>>> 

40
@Kit: Якщо ви хочете, щоб усі літерали були Unicode (як у Python 3), поставте from __future__ import unicode_literalsна початку вихідні файли.
Філіп

1
Так, це отримає вас, якщо ви звикли до форматування%, оскільки це працює "% s"% u "\ u2265", але формат "{}". (U "\ u2265") викине виняток.
Hylidan

2
яка проста річ .. який страшний головний біль у мене з’явився, поки я не знайшов цього шматочка просвіти ..
Iosu S.


5

Трохи більше інформації про те , чому це відбувається.

>>> s = u'\u2265'
>>> print s

працює, оскільки printавтоматично використовує кодування системи для вашого середовища, яке, швидше за все, було встановлено на UTF-8. (Ви можете перевірити, зробивши import sys; print sys.stdout.encoding)

>>> print "{0}".format(s)

не вдається, тому що formatнамагається відповідати кодуванню типу, на який він викликається (я не зміг знайти документацію щодо цього, але це поведінка, яку я помітив). Оскільки рядкові літерали - це рядки байтів, кодовані як ASCII в python 2, formatнамагається кодувати sяк ASCII, що призводить до цього виключення. Дотримуйтесь:

>>> s = u'\u2265'
>>> s.encode('ascii')
Traceback (most recent call last):
  File "<input>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2265' in position 0: ordinal not in range(128)

Тому в основному саме ці підходи працюють:

>>> s = u'\u2265'
>>> print u'{}'.format(s)

>>> print '{}'.format(s.encode('utf-8'))

Набір символів джерела визначається декларацією кодування; це ASCII, якщо в вихідному файлі не вказано декларацію про кодування ( https://docs.python.org/2/reference/lexical_analysis.html#string-literals )


1
Про , і я знайшов , що це буде великою підмогою в розумінні Юникода в Python, і текстове представлення в комп'ютерних системах в цілому: nedbatchelder.com/text/unipain.html
LPS
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.