Python 3 có hỗ trợ Unicode không?
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 Show
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ỗiTrong 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)3 cho chuỗi ký tự >>> s = 'Café' # byte string >>> s 'Caf\xc3\xa9' >>> type(s) 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)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)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)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) Nhân vậtPython 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)7 là 5, không phải 4 vì >>> s = 'Café' >>> type(s)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)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ã Unicodelà 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óaMộ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 UnicodeMộ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)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)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)
|