Python: Sử dụng .format () trên chuỗi thoát Unicode


156

Tôi đang sử dụng Python 2.6.5. Mã của tôi yêu cầu sử dụng dấu "nhiều hơn hoặc bằng". Nó đi từ đây:

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

Tại sao tôi nhận được lỗi này? Có một cách đúng đắn để làm điều này? Tôi cần sử dụng .format()chức năng.

Câu trả lời:


243

Chỉ cần tạo chuỗi thứ hai cũng là một chuỗi 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: Nếu bạn muốn tất cả các chữ đều là Unicode (như trong Python 3), hãy đặt from __future__ import unicode_literalsở đầu các tệp nguồn của bạn.
Phi

1
Vâng, điều này sẽ giúp bạn nếu bạn đã sử dụng định dạng% vì "% s"% u "\ u2265" này hoạt động, nhưng định dạng "{}". (U "\ u2265") sẽ đưa ra một ngoại lệ.
Hylidan 18/2/2015

2
thật là một điều đơn giản .. thật là một cơn đau đầu khủng khiếp tôi đã nhận được cho đến khi tôi tìm thấy chút giác ngộ này ..
Iosu S.


5

Thêm một chút thông tin về lý do tại sao điều đó xảy ra.

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

hoạt động vì printtự động sử dụng mã hóa hệ thống cho môi trường của bạn, có khả năng được đặt thành UTF-8. (Bạn có thể kiểm tra bằng cách làm import sys; print sys.stdout.encoding)

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

thất bại vì formatcố gắng khớp mã hóa của loại được gọi (tôi không thể tìm thấy tài liệu về điều này, nhưng đây là hành vi tôi đã nhận thấy). Vì chuỗi ký tự là các chuỗi byte được mã hóa dưới dạng ASCII trong python 2, nên formatcố gắng mã hóa sthành ASCII, sau đó dẫn đến ngoại lệ đó. Quan sát:

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

Vì vậy, đó là cơ bản tại sao các phương pháp này hoạt động:

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

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

Bộ ký tự nguồn được xác định bởi khai báo mã hóa; đó là ASCII nếu không có khai báo mã hóa nào được đưa ra trong tệp nguồn ( https://docs.python.org/2/reference/lexical_analysis.html#opes-literals )


1
Oh và tôi thấy điều này giúp ích rất nhiều trong việc hiểu unicode trong python và biểu diễn văn bản trong các hệ thống máy tính nói chung: nedbatchelder.com/text/unipain.html
lps
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.