Mục tiêu chính của bảng gian lận này là thu thập một số đoạn phổ biến có liên quan đến Unicode. Trong Python 3, các chuỗi được biểu thị bằng Unicode thay vì byte. Thông tin thêm có thể được tìm thấy trên PEP 3100
Mã ASCII là tiêu chuẩn nổi tiếng nhất xác định mã số cho các ký tự. Các giá trị số ban đầu chỉ xác định 128 ký tự, vì vậy ASCII chỉ chứa mã điều khiển, chữ số, chữ thường, chữ in hoa, v.v. Tuy nhiên, nó không đủ để chúng tôi đại diện cho các ký tự như ký tự có dấu, ký tự Trung Quốc hoặc biểu tượng cảm xúc tồn tại trên toàn thế giới. Do đó, Unicode đã được phát triển để giải quyết vấn đề này. Nó xác định điểm mã để đại diện cho các ký tự khác nhau như ASCII nhưng số lượng ký tự lên tới 1.111.998
Mục lục
Chuỗi
Trong Python 2, các chuỗi được biểu thị bằng byte, không phải Unicode. Python cung cấp các loại chuỗi khác nhau như chuỗi Unicode, chuỗi thô, v.v. Trong trường hợp này, nếu muốn khai báo một chuỗi Unicode, chúng ta thêm tiền tố
>>> s = 'Café' >>> type[s] >>> s 'Café' >>> s.encode['utf-8'] b'Caf\xc3\xa9' >>> s.encode['utf-8'].decode['utf-8'] 'Café'3 cho chuỗi ký tự
>>> s = 'Café' # byte string >>> s 'Caf\xc3\xa9' >>> type[s] >>> u = u'Café' # unicode string >>> u u'Caf\xe9' >>> type[u]
Trong Python 3, các chuỗi được biểu diễn bằng Unicode. Nếu chúng ta muốn biểu diễn một chuỗi byte, chúng ta thêm tiền tố
>>> s = 'Café' >>> type[s] >>> s 'Café' >>> s.encode['utf-8'] b'Caf\xc3\xa9' >>> s.encode['utf-8'].decode['utf-8'] 'Café'4 cho chuỗi ký tự. Lưu ý rằng các phiên bản Python đầu tiên [3. 0-3. 2] không hỗ trợ tiền tố
>>> s = 'Café' >>> type[s] >>> s 'Café' >>> s.encode['utf-8'] b'Caf\xc3\xa9' >>> s.encode['utf-8'].decode['utf-8'] 'Café'3. Để giảm bớt khó khăn khi di chuyển các ứng dụng nhận biết Unicode từ Python 2, Python 3. 3 một lần nữa hỗ trợ tiền tố
>>> s = 'Café' >>> type[s] >>> s 'Café' >>> s.encode['utf-8'] b'Caf\xc3\xa9' >>> s.encode['utf-8'].decode['utf-8'] 'Café'3 cho chuỗi ký tự. Thông tin thêm có thể được tìm thấy trên PEP 414
>>> s = 'Café' >>> type[s] >>> s 'Café' >>> s.encode['utf-8'] b'Caf\xc3\xa9' >>> s.encode['utf-8'].decode['utf-8'] 'Café'
Nhân vật
Python 2 lấy tất cả các ký tự chuỗi dưới dạng byte. Trong trường hợp này, độ dài của chuỗi có thể không tương đương với số lượng ký tự. Ví dụ: độ dài của
>>> s = 'Café' >>> type[s] >>> s 'Café' >>> s.encode['utf-8'] b'Caf\xc3\xa9' >>> s.encode['utf-8'].decode['utf-8'] 'Café'7 là 5, không phải 4 vì
>>> s = 'Café' >>> type[s] >>> s 'Café' >>> s.encode['utf-8'] b'Caf\xc3\xa9' >>> s.encode['utf-8'].decode['utf-8'] 'Café'8 được mã hóa dưới dạng ký tự 2 byte
________số 8_______
Python 3 lấy tất cả các ký tự chuỗi làm điểm mã Unicode. Độ dài của một chuỗi luôn tương đương với số ký tự
>>> s = 'Café' >>> print[[_c for _c in s]] ['C', 'a', 'f', 'é'] >>> len[s] 4 >>> bs = bytes[s, encoding='utf-8'] >>> print[bs] b'Caf\xc3\xa9' >>> len[bs] 5
Chuyển unicode[s, 'utf-8']
Hàm tích hợp đã bị xóa trong Python 3, vậy cách tốt nhất để chuyển đổi biểu thức
>>> s = 'Café' >>> type[s] >>> s 'Café' >>> s.encode['utf-8'] b'Caf\xc3\xa9' >>> s.encode['utf-8'].decode['utf-8'] 'Café'9 để nó hoạt động trong cả Python 2 và 3 là gì?
Trong Python 2
>>> s = 'Café' >>> unicode[s, 'utf-8'] u'Caf\xe9' >>> s.decode['utf-8'] u'Caf\xe9' >>> unicode[s, 'utf-8'] == s.decode['utf-8'] True
Trong Trăn 3
>>> s = 'Café' >>> s.decode['utf-8'] AttributeError: 'str' object has no attribute 'decode'
Vì vậy, câu trả lời thực sự là…
Điểm mã Unicode
là một chức năng tích hợp mạnh mẽ để lấy điểm mã Unicode từ một ký tự nhất định. Do đó, nếu chúng tôi muốn kiểm tra điểm mã Unicode của một ký tự, chúng tôi có thể sử dụng
>>> s= 'Café' >>> print[[_c for _c in s]] ['C', 'a', 'f', '\xc3', '\xa9'] >>> len[s] 5 >>> s = u'Café' >>> print[[_c for _c in s]] [u'C', u'a', u'f', u'\xe9'] >>> len[s] 40
>>> s = u'Café' >>> for _c in s: print['U+%04x' % ord[_c]] ... U+0043 U+0061 U+0066 U+00e9 >>> u = '中文' >>> for _c in u: print['U+%04x' % ord[_c]] ... U+4e2d U+6587
mã hóa
Một điểm mã Unicode chuyển sang một chuỗi byte được gọi là mã hóa
>>> s = u'Café' >>> type[s.encode['utf-8']]
giải mã
Một chuỗi byte chuyển sang một điểm mã Unicode được gọi là giải mã
>>> s = bytes['Café', encoding='utf-8'] >>> s.decode['utf-8'] 'Café'
Chuẩn hóa Unicode
Một số ký tự có thể được biểu diễn ở hai dạng giống nhau. Ví dụ: ký tự,
>>> s = 'Café' >>> type[s] >>> s 'Café' >>> s.encode['utf-8'] b'Caf\xc3\xa9' >>> s.encode['utf-8'].decode['utf-8'] 'Café'8 có thể được viết là
>>> s= 'Café' >>> print[[_c for _c in s]] ['C', 'a', 'f', '\xc3', '\xa9'] >>> len[s] 5 >>> s = u'Café' >>> print[[_c for _c in s]] [u'C', u'a', u'f', u'\xe9'] >>> len[s] 42 [Phân tách chính tắc] hoặc
>>> s = 'Café' >>> type[s] >>> s 'Café' >>> s.encode['utf-8'] b'Caf\xc3\xa9' >>> s.encode['utf-8'].decode['utf-8'] 'Café'8 [Bố cục chính tắc]. Trong trường hợp này, chúng tôi có thể nhận được kết quả không mong muốn khi so sánh hai chuỗi mặc dù chúng trông giống nhau. Do đó, chúng ta có thể chuẩn hóa một dạng Unicode để giải quyết vấn đề
# python 3 >>> u1 = 'Café' # unicode string >>> u2 = 'Cafe\u0301' >>> u1, u2 ['Café', 'Café'] >>> len[u1], len[u2] [4, 5] >>> u1 == u2 False >>> u1.encode['utf-8'] # get u1 byte string b'Caf\xc3\xa9' >>> u2.encode['utf-8'] # get u2 byte string b'Cafe\xcc\x81' >>> from unicodedata import normalize >>> s1 = normalize['NFC', u1] # get u1 NFC format >>> s2 = normalize['NFC', u2] # get u2 NFC format >>> s1 == s2 True >>> s1.encode['utf-8'], s2.encode['utf-8'] [b'Caf\xc3\xa9', b'Caf\xc3\xa9'] >>> s1 = normalize['NFD', u1] # get u1 NFD format >>> s2 = normalize['NFD', u2] # get u2 NFD format >>> s1, s2 ['Café', 'Café'] >>> s1 == s2 True >>> s1.encode['utf-8'], s2.encode['utf-8'] [b'Cafe\xcc\x81', b'Cafe\xcc\x81']
Tránh >>> s = 'Café'
>>> type[s]
>>> s
'Café'
>>> s.encode['utf-8']
b'Caf\xc3\xa9'
>>> s.encode['utf-8'].decode['utf-8']
'Café'
2
Python tăng UnicodeDecodeError khi chuỗi byte không thể giải mã thành điểm mã Unicode. Nếu chúng ta muốn tránh ngoại lệ này, chúng ta có thể chuyển đối số thay thế, dấu gạch chéo ngược hoặc bỏ qua đối số lỗi trong