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.

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

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


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 )


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.