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ที่จุดเริ่มต้นของไฟล์ต้นฉบับของคุณ
Philipp

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
โอ้และฉันพบว่าสิ่งนี้มีประโยชน์อย่างมากในการทำความเข้าใจ unicode ใน python และการแสดงข้อความในระบบคอมพิวเตอร์โดยทั่วไป: nedbatchelder.com/text/unipain.html
lps
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.