Python: Unicode çıkışlı bir dizede .format () kullanma


156

Python 2.6.5 kullanıyorum. Kodum "eşit veya eşit" işaretinin kullanılmasını gerektirir. İşte gidiyor:

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

Neden bu hatayı alıyorum? Bunu yapmanın doğru bir yolu var mı? .format()İşlevi kullanmam gerekiyor .

Yanıtlar:


243

İkinci dizgeyi ayrıca bir unicode dizgisi yapın

>>> 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: Tüm değişmezlerin Unicode olmasını istiyorsanız (Python 3'te olduğu gibi), from __future__ import unicode_literalskaynak dosyalarınızın başına koyun .
Philipp

1
Evet, bu "% s"% u "\ u2265" çalıştığından% biçimlendirmeye alışkınsanız, ancak "{}". Biçiminde (u "\ u2265") bir istisna atarsanız bu size ulaşacaktır.
Hylidan

2
ne basit bir şey .. aydınlanma bu bit bulana kadar ne korkunç bir baş ağrısı var ..
Iosu S.


5

Bunun neden olduğu hakkında biraz daha fazla bilgi .

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

printmuhtemelen ortamınız için otomatik olarak UTF-8 olarak ayarlanmış sistem kodlamasını kullandığından çalışır . (Yaparak kontrol edebilirsiniz import sys; print sys.stdout.encoding)

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

başarısız olduğu formatiçin çağrıldığı türün kodlamasını eşleştirmeye çalışır (bu konuda belge bulamadım, ancak bu fark ettiğim davranış). Dize değişmezleri, python 2'de ASCII olarak kodlanan bayt dizeleri olduğundan ASCII formatolarak kodlamaya çalışır s, bu da bu istisna ile sonuçlanır. Gözlemek:

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

İşte bu yüzden bu yaklaşımlar işe yarıyor:

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

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

Kaynak karakter seti kodlama bildirimi ile tanımlanır; kaynak dosyada kodlama beyanı verilmemişse ASCII'dir ( https://docs.python.org/2/reference/lexical_analysis.html#string-literals )


1
Oh ve ben bunu python unicode ve genel olarak bilgisayar sistemlerinde metin temsilini anlamada çok yardımcı buldum: nedbatchelder.com/text/unipain.html
lps
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.