Có một vấn đề đáng kể với một số câu trả lời được đăng cho đến nay: unicode()
giải mã từ mã hóa mặc định, thường là ASCII; trong thực tế, unicode()
cố gắng làm cho "ý nghĩa" của các byte được đưa ra bằng cách chuyển đổi chúng thành các ký tự. Do đó, đoạn mã sau, về cơ bản là những gì được đề xuất bởi các câu trả lời trước, đã thất bại trên máy của tôi:
# -*- coding: utf-8 -*-
author = 'éric'
print '{0}'.format(unicode(author))
cho:
Traceback (most recent call last):
File "test.py", line 3, in <module>
print '{0}'.format(unicode(author))
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)
Lỗi này xuất phát từ thực tế là author
không chỉ chứa các byte ASCII (nghĩa là có các giá trị trong [0; 127]) và unicode()
giải mã theo ASCII theo mặc định (trên nhiều máy).
Một giải pháp mạnh mẽ là cung cấp mã hóa rõ ràng được sử dụng trong các lĩnh vực của bạn; lấy UTF-8 làm ví dụ:
u'{0} in {1}'.format(unicode(self.author, 'utf-8'), unicode(self.publication, 'utf-8'))
(hoặc không có chữ cái đầu tiên u
, tùy thuộc vào việc bạn muốn kết quả Unicode hay chuỗi byte).
Tại thời điểm này, người ta có thể muốn xem xét việc có author
và publication
các trường là các chuỗi Unicode, thay vì giải mã chúng trong quá trình định dạng.
'{} in {}'
chuỗi định dạng đơn giản .