Python: Menggunakan .format () pada string Unicode-escaped

156

Saya menggunakan Python 2.6.5. Kode saya mengharuskan penggunaan tanda "lebih dari atau sama dengan". Ini dia:

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

Mengapa saya mendapatkan kesalahan ini? Apakah ada cara yang tepat untuk melakukan ini? Saya perlu menggunakan .format()fungsinya.

Kit
sumber

Jawaban:

243

Buat saja string kedua juga string 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)
≥
>>> 
Ilmuwan gila
sumber
40
@Kit: Jika Anda ingin semua literal menjadi Unicode (seperti pada Python 3), letakkan from __future__ import unicode_literalsdi awal file sumber Anda.
Philipp
1
Ya, ini akan membantu Anda jika Anda terbiasa dengan% format karena ini "% s"% u "\ u2265" berfungsi, tetapi "{}". Format (u "\ u2265") akan memberikan pengecualian.
Hylidan
2
Sungguh
70

unicodePerlu unicodeformat string.

>>> print u'{0}'.format(s)
Ignacio Vazquez-Abrams
sumber
5

Sedikit informasi lebih lanjut tentang mengapa itu terjadi.

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

berfungsi karena printsecara otomatis menggunakan pengkodean sistem untuk lingkungan Anda, yang kemungkinan diatur ke UTF-8. (Anda dapat memeriksa dengan melakukan import sys; print sys.stdout.encoding)

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

gagal karena formatmencoba mencocokkan pengodean dari jenis yang dipanggil (saya tidak dapat menemukan dokumentasi tentang ini, tapi ini adalah perilaku yang saya perhatikan). Karena string literal adalah string byte yang dikodekan sebagai ASCII dalam python 2, formatmencoba untuk menyandikan ssebagai ASCII, yang kemudian menghasilkan pengecualian itu. Mengamati:

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

Jadi pada dasarnya itulah mengapa pendekatan ini bekerja:

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

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

Set karakter sumber ditentukan oleh deklarasi penyandian; itu ASCII jika tidak ada deklarasi pengkodean yang diberikan dalam file sumber ( https://docs.python.org/2/reference/lexical_analysis.html#string-literals )

lps
sumber
1
Oh dan saya menemukan ini sangat membantu dalam memahami unicode di python, dan perwakilan teks dalam sistem komputer pada umumnya: nedbatchelder.com/text/unipain.html
LPS