Câu hỏi của bạn không chính xác; lỗi bạn thấy không phải là kết quả của cách bạn tạo python, mà là sự nhầm lẫn giữa chuỗi byte và chuỗi unicode.
Chuỗi byte (ví dụ "foo" hoặc 'bar', theo cú pháp python) là chuỗi các octet; các số từ 0-255. Chuỗi Unicode (ví dụ: u "foo" hoặc u'bar ') là chuỗi các điểm mã unicode; số từ 0-1112064. Nhưng bạn có vẻ hứng thú với ký tự é, trong đó (trong thiết bị đầu cuối của bạn) là một chuỗi nhiều byte đại diện cho một ký tự.
Thay vì ord(u'é')
, hãy thử điều này:
>>> [ord(x) for x in u'é']
Điều đó cho bạn biết chuỗi điểm nào "é" đại diện. Nó có thể cung cấp cho bạn [233] hoặc có thể cung cấp cho bạn [101, 770].
Thay vì chr()
đảo ngược điều này, có unichr()
:
>>> unichr(233)
u'\xe9'
Ký tự này thực sự có thể được biểu diễn bằng một hoặc nhiều "điểm mã" đơn, mà chính chúng đại diện cho biểu đồ hoặc ký tự. Đó là "e với dấu trọng âm (nghĩa là mã điểm 233)" hoặc "e" (mã điểm 101), theo sau là "dấu trọng âm trên ký tự trước" (điểm mã 770). Vì vậy, chính xác ký tự này có thể được trình bày dưới dạng cấu trúc dữ liệu Python u'e\u0301'
hoặc u'\u00e9'
.
Hầu hết thời gian bạn không cần phải quan tâm đến vấn đề này, nhưng nó có thể trở thành vấn đề nếu bạn lặp qua chuỗi unicode, vì phép lặp hoạt động theo điểm mã chứ không phải bằng ký tự có thể phân tách. Nói cách khác, len(u'e\u0301') == 2
và len(u'\u00e9') == 1
. Nếu điều này quan trọng với bạn, bạn có thể chuyển đổi giữa các hình thức sáng tác và phân tách bằng cách sử dụngunicodedata.normalize
.
Thuật ngữ Unicode có thể là một hướng dẫn hữu ích để hiểu một số vấn đề này, bằng cách chỉ ra cách mỗi thuật ngữ cụ thể đề cập đến một phần khác nhau của cách trình bày văn bản, phức tạp hơn nhiều so với nhiều lập trình viên nhận ra.