Các chuỗi Unicode có thể được mã hóa thành các chuỗi đơn giản theo nhiều cách khác nhau, tùy theo cách mã hóa bạn chọn
# Convert Unicode to plain Python string: "encode" unicodestring = u"Hello world" utf8string = unicodestring.encode["utf-8"] asciistring = unicodestring.encode["ascii"] isostring = unicodestring.encode["ISO-8859-1"] utf16string = unicodestring.encode["utf-16"] # Convert plain Python string to Unicode: "decode" plainstring1 = unicode[utf8string, "utf-8"] plainstring2 = unicode[asciistring, "ascii"] plainstring3 = unicode[isostring, "ISO-8859-1"] plainstring4 = unicode[utf16string, "utf-16"] assert plainstring1==plainstring2==plainstring3==plainstring4
Nếu bạn thấy mình đang xử lý văn bản chứa các ký tự không phải ASCII, bạn phải tìm hiểu về Unicode—nó là gì, nó hoạt động như thế nào và Python sử dụng nó như thế nào
Unicode là một chủ đề lớn. May mắn thay, bạn không cần phải biết mọi thứ về Unicode để có thể giải quyết các vấn đề trong thế giới thực với nó. một vài kiến thức cơ bản là đủ. Trước tiên, bạn phải hiểu sự khác biệt giữa byte và ký tự. Trong các ngôn ngữ và môi trường cũ hơn, lấy ASCII làm trung tâm, byte và ký tự được coi là giống nhau. Vì một byte có thể chứa tối đa 256 giá trị nên các môi trường này bị giới hạn ở 256 ký tự. Mặt khác, Unicode có hàng chục nghìn ký tự. Điều đó có nghĩa là mỗi ký tự Unicode chiếm nhiều hơn một byte, vì vậy bạn cần phân biệt giữa ký tự và byte
Các chuỗi Python tiêu chuẩn thực sự là các chuỗi byte và một ký tự Python thực sự là một byte. Các thuật ngữ khác cho loại Python tiêu chuẩn là “chuỗi 8 bit” và “chuỗi đơn giản. ” Trong công thức này, chúng tôi sẽ gọi chúng là các chuỗi byte, để nhắc bạn về hướng byte của chúng
Ngược lại, một ký tự Unicode trong Python là một đối tượng trừu tượng đủ lớn để chứa ký tự đó, tương tự như các số nguyên dài của Python. Bạn không phải lo lắng về đại diện nội bộ; . Khi đó, bạn phải chọn cách biểu diễn các ký tự dưới dạng byte. Chuyển đổi từ Unicode sang chuỗi byte được gọi là mã hóa chuỗi. Tương tự, khi bạn tải chuỗi Unicode từ tệp, ổ cắm hoặc đối tượng hướng byte khác, bạn cần giải mã chuỗi từ byte thành ký tự
Có nhiều cách chuyển đổi đối tượng Unicode thành chuỗi byte, mỗi cách được gọi là mã hóa. Vì nhiều lý do lịch sử, chính trị và kỹ thuật, không có một mã hóa “đúng” nào. Mọi mã hóa đều có tên không phân biệt chữ hoa chữ thường và tên đó được chuyển cho phương thức giải mã dưới dạng tham số. Dưới đây là một số bạn nên biết về
Mã hóa UTF-8 có thể xử lý bất kỳ ký tự Unicode nào. Nó cũng tương thích ngược với ASCII, do đó, tệp ASCII thuần túy cũng có thể được coi là tệp UTF-8 và tệp UTF-8 chỉ sử dụng các ký tự ASCII giống hệt với tệp ASCII có cùng ký tự. Thuộc tính này làm cho UTF-8 rất tương thích ngược, đặc biệt là với các công cụ Unix cũ hơn. UTF-8 là mã hóa thống trị trên Unix. Điểm yếu chính của nó là nó khá kém hiệu quả đối với các văn bản phương Đông
Mã hóa UTF-16 được ưa chuộng bởi hệ điều hành Microsoft và môi trường Java. Nó kém hiệu quả hơn đối với các ngôn ngữ phương Tây nhưng hiệu quả hơn đối với các ngôn ngữ phương Đông. Một biến thể của UTF-16 đôi khi được gọi là UCS-2
Chuỗi mã hóa ISO-8859 là siêu tập hợp ASCII 256 ký tự. Chúng không thể hỗ trợ tất cả các ký tự Unicode; . ISO-8859-1, còn được gọi là Latin-1, bao gồm hầu hết các ngôn ngữ Tây Âu và Châu Phi, trừ tiếng Ả Rập. ISO-8859-2, còn được gọi là Latin-2, bao gồm nhiều ngôn ngữ Đông Âu như tiếng Hungary và tiếng Ba Lan
Nếu bạn muốn có thể mã hóa tất cả các ký tự Unicode, có lẽ bạn muốn sử dụng UTF-8. Bạn có thể sẽ chỉ cần xử lý các mã hóa khác khi bạn được cung cấp dữ liệu trong các mã hóa đó được tạo bởi một số ứng dụng khác
So sánh chuỗi rất phức tạp bởi thực tế là Unicode có các ký tự kết hợp. dấu phụ và các dấu khác gắn vào ký tự trước đó, xuất hiện dưới dạng ký tự khi được in
Ví dụ: từ “café” có thể được soạn theo hai cách, sử dụng bốn hoặc năm điểm mã, nhưng kết quả trông giống hệt nhau
>>>
s1
=
'café'
>>>
s2
=
'cafe
\N{COMBINING ACUTE ACCENT}
'
>>>
s1
,
s2
['café', 'café']
>>>
len
[
s1
],
len
[
s2
]
[4, 5]
>>>
s1
==
s2
False
Đặt
3 [U+0301] sau “e” sẽ hiển thị “é”. Trong tiêu chuẩn Unicode, các chuỗi như>>>
from
unicodedata
import
normalize
>>>
s1
=
'café'
>>>
s2
=
'cafe
\N{COMBINING ACUTE ACCENT}
'
>>>
len
[
s1
],
len
[
s2
]
[4, 5]
>>>
len
[
normalize
[
'NFC'
,
s1
]],
len
[
normalize
[
'NFC'
,
s2
]]
[4, 4]
>>>
len
[
normalize
[
'NFD'
,
s1
]],
len
[
normalize
[
'NFD'
,
s2
]]
[5, 5]
>>>
normalize
[
'NFC'
,
s1
]
==
normalize
[
'NFC'
,
s2
]
True
>>>
normalize
[
'NFD'
,
s1
]
==
normalize
[
'NFD'
,
s2
]
True
4 và>>>
from
unicodedata
import
normalize
>>>
s1
=
'café'
>>>
s2
=
'cafe
\N{COMBINING ACUTE ACCENT}
'
>>>
len
[
s1
],
len
[
s2
]
[4, 5]
>>>
len
[
normalize
[
'NFC'
,
s1
]],
len
[
normalize
[
'NFC'
,
s2
]]
[4, 4]
>>>
len
[
normalize
[
'NFD'
,
s1
]],
len
[
normalize
[
'NFD'
,
s2
]]
[5, 5]
>>>
normalize
[
'NFC'
,
s1
]
==
normalize
[
'NFC'
,
s2
]
True
>>>
normalize
[
'NFD'
,
s1
]
==
normalize
[
'NFD'
,
s2
]
True
5 được gọi là "tương đương chính tắc" và các ứng dụng được coi là giống nhau. Nhưng Python thấy hai chuỗi điểm mã khác nhau và coi chúng không bằng nhau>>>
from
unicodedata
import
normalize
>>>
s1
=
'café'
>>>
s2
=
'cafe
\N{COMBINING ACUTE ACCENT}
'
>>>
len
[
s1
],
len
[
s2
]
[4, 5]
>>>
len
[
normalize
[
'NFC'
,
s1
]],
len
[
normalize
[
'NFC'
,
s2
]]
[4, 4]
>>>
len
[
normalize
[
'NFD'
,
s1
]],
len
[
normalize
[
'NFD'
,
s2
]]
[5, 5]
>>>
normalize
[
'NFC'
,
s1
]
==
normalize
[
'NFC'
,
s2
]
True
>>>
normalize
[
'NFD'
,
s1
]
==
normalize
[
'NFD'
,
s2
]
True
Giải pháp là
6. Đối số đầu tiên của hàm đó là một trong bốn chuỗi.>>>
from
unicodedata
import
normalize
>>>
s1
=
'café'
>>>
s2
=
'cafe
\N{COMBINING ACUTE ACCENT}
'
>>>
len
[
s1
],
len
[
s2
]
[4, 5]
>>>
len
[
normalize
[
'NFC'
,
s1
]],
len
[
normalize
[
'NFC'
,
s2
]]
[4, 4]
>>>
len
[
normalize
[
'NFD'
,
s1
]],
len
[
normalize
[
'NFD'
,
s2
]]
[5, 5]
>>>
normalize
[
'NFC'
,
s1
]
==
normalize
[
'NFC'
,
s2
]
True
>>>
normalize
[
'NFD'
,
s1
]
==
normalize
[
'NFD'
,
s2
]
True
7,>>>
from
unicodedata
import
normalize
>>>
s1
=
'café'
>>>
s2
=
'cafe
\N{COMBINING ACUTE ACCENT}
'
>>>
len
[
s1
],
len
[
s2
]
[4, 5]
>>>
len
[
normalize
[
'NFC'
,
s1
]],
len
[
normalize
[
'NFC'
,
s2
]]
[4, 4]
>>>
len
[
normalize
[
'NFD'
,
s1
]],
len
[
normalize
[
'NFD'
,
s2
]]
[5, 5]
>>>
normalize
[
'NFC'
,
s1
]
==
normalize
[
'NFC'
,
s2
]
True
>>>
normalize
[
'NFD'
,
s1
]
==
normalize
[
'NFD'
,
s2
]
True
8,>>>
from
unicodedata
import
normalize
>>>
s1
=
'café'
>>>
s2
=
'cafe
\N{COMBINING ACUTE ACCENT}
'
>>>
len
[
s1
],
len
[
s2
]
[4, 5]
>>>
len
[
normalize
[
'NFC'
,
s1
]],
len
[
normalize
[
'NFC'
,
s2
]]
[4, 4]
>>>
len
[
normalize
[
'NFD'
,
s1
]],
len
[
normalize
[
'NFD'
,
s2
]]
[5, 5]
>>>
normalize
[
'NFC'
,
s1
]
==
normalize
[
'NFC'
,
s2
]
True
>>>
normalize
[
'NFD'
,
s1
]
==
normalize
[
'NFD'
,
s2
]
True
9 và>>>
from
unicodedata
import
normalize
>>>
s1
=
'café'
>>>
s2
=
'cafe
\N{COMBINING ACUTE ACCENT}
'
>>>
len
[
s1
],
len
[
s2
]
[4, 5]
>>>
len
[
normalize
[
'NFC'
,
s1
]],
len
[
normalize
[
'NFC'
,
s2
]]
[4, 4]
>>>
len
[
normalize
[
'NFD'
,
s1
]],
len
[
normalize
[
'NFD'
,
s2
]]
[5, 5]
>>>
normalize
[
'NFC'
,
s1
]
==
normalize
[
'NFC'
,
s2
]
True
>>>
normalize
[
'NFD'
,
s1
]
==
normalize
[
'NFD'
,
s2
]
True
0. Hãy bắt đầu với hai cái đầu tiên>>>
from
unicodedata
import
normalize
,
name
>>>
ohm
=
'
\u2126
'
>>>
name
[
ohm
]
'OHM SIGN'
>>>
ohm_c
=
normalize
[
'NFC'
,
ohm
]
>>>
name
[
ohm_c
]
'GREEK CAPITAL LETTER OMEGA'
>>>
ohm
==
ohm_c
False
>>>
normalize
[
'NFC'
,
ohm
]
==
normalize
[
'NFC'
,
ohm_c
]
True
Biểu mẫu chuẩn hóa C [NFC] tổng hợp các điểm mã để tạo ra chuỗi tương đương ngắn nhất, trong khi NFD phân tách, mở rộng các ký tự được tổng hợp thành các ký tự cơ sở và các ký tự kết hợp riêng biệt. Cả hai cách chuẩn hóa này đều làm cho phép so sánh hoạt động như mong đợi, như ví dụ tiếp theo cho thấy
>>>
from
unicodedata
import
normalize
>>>
s1
=
'café'
>>>
s2
=
'cafe
\N{COMBINING ACUTE ACCENT}
'
>>>
len
[
s1
],
len
[
s2
]
[4, 5]
>>>
len
[
normalize
[
'NFC'
,
s1
]],
len
[
normalize
[
'NFC'
,
s2
]]
[4, 4]
>>>
len
[
normalize
[
'NFD'
,
s1
]],
len
[
normalize
[
'NFD'
,
s2
]]
[5, 5]
>>>
normalize
[
'NFC'
,
s1
]
==
normalize
[
'NFC'
,
s2
]
True
>>>
normalize
[
'NFD'
,
s1
]
==
normalize
[
'NFD'
,
s2
]
True
Trình điều khiển bàn phím thường tạo ra các ký tự được soạn thảo, vì vậy văn bản do người dùng nhập sẽ ở dạng NFC theo mặc định. Tuy nhiên, để an toàn, có thể tốt hơn là chuẩn hóa các chuỗi bằng
1 trước khi lưu. NFC cũng là dạng chuẩn hóa được W3C đề xuất trong “Mô hình ký tự cho World Wide Web. So khớp chuỗi và tìm kiếm”>>>
from
unicodedata
import
normalize
,
name
>>>
ohm
=
'
\u2126
'
>>>
name
[
ohm
]
'OHM SIGN'
>>>
ohm_c
=
normalize
[
'NFC'
,
ohm
]
>>>
name
[
ohm_c
]
'GREEK CAPITAL LETTER OMEGA'
>>>
ohm
==
ohm_c
False
>>>
normalize
[
'NFC'
,
ohm
]
==
normalize
[
'NFC'
,
ohm_c
]
True
Một số ký tự đơn được NFC chuẩn hóa thành một ký tự đơn khác. Biểu tượng cho đơn vị điện trở ohm [Ω] được chuẩn hóa thành chữ hoa Hy Lạp omega. Chúng giống hệt nhau về mặt hình ảnh, nhưng chúng so sánh không bằng nhau, vì vậy điều cần thiết là phải chuẩn hóa để tránh bất ngờ
>>>
from
unicodedata
import
normalize
,
name
>>>
ohm
=
'
\u2126
'
>>>
name
[
ohm
]
'OHM SIGN'
>>>
ohm_c
=
normalize
[
'NFC'
,
ohm
]
>>>
name
[
ohm_c
]
'GREEK CAPITAL LETTER OMEGA'
>>>
ohm
==
ohm_c
False
>>>
normalize
[
'NFC'
,
ohm
]
==
normalize
[
'NFC'
,
ohm_c
]
True
Hai dạng chuẩn hóa khác là NFKC và NFKD, trong đó chữ K là viết tắt của “khả năng tương thích. ” Đây là những hình thức chuẩn hóa mạnh mẽ hơn, ảnh hưởng đến cái gọi là “ký tự tương thích. ” Mặc dù một mục tiêu của Unicode là có một điểm mã “chuẩn” duy nhất cho mỗi ký tự, một số ký tự xuất hiện nhiều lần để tương thích với các tiêu chuẩn có sẵn. Ví dụ:
2,>>>
from
unicodedata
import
normalize
,
name
>>>
ohm
=
'
\u2126
'
>>>
name
[
ohm
]
'OHM SIGN'
>>>
ohm_c
=
normalize
[
'NFC'
,
ohm
]
>>>
name
[
ohm_c
]
'GREEK CAPITAL LETTER OMEGA'
>>>
ohm
==
ohm_c
False
>>>
normalize
[
'NFC'
,
ohm
]
==
normalize
[
'NFC'
,
ohm_c
]
True
3 [_______94], đã được thêm vào Unicode để hỗ trợ chuyển đổi khứ hồi thành>>>
from
unicodedata
import
normalize
,
name
>>>
ohm
=
'
\u2126
'
>>>
name
[
ohm
]
'OHM SIGN'
>>>
ohm_c
=
normalize
[
'NFC'
,
ohm
]
>>>
name
[
ohm_c
]
'GREEK CAPITAL LETTER OMEGA'
>>>
ohm
==
ohm_c
False
>>>
normalize
[
'NFC'
,
ohm
]
==
normalize
[
'NFC'
,
ohm_c
]
True
5, bao gồm cả nó, mặc dù cùng một ký tự là một phần của bảng chữ cái Hy Lạp với mã điểm>>>
from
unicodedata
import
normalize
,
name
>>>
ohm
=
'
\u2126
'
>>>
name
[
ohm
]
'OHM SIGN'
>>>
ohm_c
=
normalize
[
'NFC'
,
ohm
]
>>>
name
[
ohm_c
]
'GREEK CAPITAL LETTER OMEGA'
>>>
ohm
==
ohm_c
False
>>>
normalize
[
'NFC'
,
ohm
]
==
normalize
[
'NFC'
,
ohm_c
]
True
6 [>>>
from
unicodedata
import
normalize
,
name
>>>
ohm
=
'
\u2126
'
>>>
name
[
ohm
]
'OHM SIGN'
>>>
ohm_c
=
normalize
[
'NFC'
,
ohm
]
>>>
name
[
ohm_c
]
'GREEK CAPITAL LETTER OMEGA'
>>>
ohm
==
ohm_c
False
>>>
normalize
[
'NFC'
,
ohm
]
==
normalize
[
'NFC'
,
ohm_c
]
True
7]. Vì vậy, dấu hiệu vi mô được coi là “ký tự tương thích. ”>>>
from
unicodedata
import
normalize
,
name
>>>
ohm
=
'
\u2126
'
>>>
name
[
ohm
]
'OHM SIGN'
>>>
ohm_c
=
normalize
[
'NFC'
,
ohm
]
>>>
name
[
ohm_c
]
'GREEK CAPITAL LETTER OMEGA'
>>>
ohm
==
ohm_c
False
>>>
normalize
[
'NFC'
,
ohm
]
==
normalize
[
'NFC'
,
ohm_c
]
True
Trong các biểu mẫu NFKC và NFKD, mỗi ký tự tương thích được thay thế bằng "sự phân tách khả năng tương thích" của một hoặc nhiều ký tự được coi là biểu diễn "ưu tiên", ngay cả khi có một số mất định dạng—lý tưởng nhất là định dạng phải do bên ngoài chịu trách nhiệm. . Để làm ví dụ, phân tách tương thích của phân số một nửa
8 [>>>
from
unicodedata
import
normalize
,
name
>>>
ohm
=
'
\u2126
'
>>>
name
[
ohm
]
'OHM SIGN'
>>>
ohm_c
=
normalize
[
'NFC'
,
ohm
]
>>>
name
[
ohm_c
]
'GREEK CAPITAL LETTER OMEGA'
>>>
ohm
==
ohm_c
False
>>>
normalize
[
'NFC'
,
ohm
]
==
normalize
[
'NFC'
,
ohm_c
]
True
9] là chuỗi ba ký tự>>>
from
unicodedata
import
normalize
,
name
>>>
ohm
=
'
\u2126
'
>>>
name
[
ohm
]
'OHM SIGN'
>>>
ohm_c
=
normalize
[
'NFC'
,
ohm
]
>>>
name
[
ohm_c
]
'GREEK CAPITAL LETTER OMEGA'
>>>
ohm
==
ohm_c
False
>>>
normalize
[
'NFC'
,
ohm
]
==
normalize
[
'NFC'
,
ohm_c
]
True
10 và phân tách tương thích của ký hiệu vi mô>>>
from
unicodedata
import
normalize
>>>
s1
=
'café'
>>>
s2
=
'cafe
\N{COMBINING ACUTE ACCENT}
'
>>>
len
[
s1
],
len
[
s2
]
[4, 5]
>>>
len
[
normalize
[
'NFC'
,
s1
]],
len
[
normalize
[
'NFC'
,
s2
]]
[4, 4]
>>>
len
[
normalize
[
'NFD'
,
s1
]],
len
[
normalize
[
'NFD'
,
s2
]]
[5, 5]
>>>
normalize
[
'NFC'
,
s1
]
==
normalize
[
'NFC'
,
s2
]
True
>>>
normalize
[
'NFD'
,
s1
]
==
normalize
[
'NFD'
,
s2
]
True
11 [>>>
from
unicodedata
import
normalize
>>>
s1
=
'café'
>>>
s2
=
'cafe
\N{COMBINING ACUTE ACCENT}
'
>>>
len
[
s1
],
len
[
s2
]
[4, 5]
>>>
len
[
normalize
[
'NFC'
,
s1
]],
len
[
normalize
[
'NFC'
,
s2
]]
[4, 4]
>>>
len
[
normalize
[
'NFD'
,
s1
]],
len
[
normalize
[
'NFD'
,
s2
]]
[5, 5]
>>>
normalize
[
'NFC'
,
s1
]
==
normalize
[
'NFC'
,
s2
]
True
>>>
normalize
[
'NFD'
,
s1
]
==
normalize
[
'NFD'
,
s2
]
True
4] là chữ thường mu>>>
from
unicodedata
import
normalize
,
name
>>>
ohm
=
'
\u2126
'
>>>
name
[
ohm
]
'OHM SIGN'
>>>
ohm_c
=
normalize
[
'NFC'
,
ohm
]
>>>
name
[
ohm_c
]
'GREEK CAPITAL LETTER OMEGA'
>>>
ohm
==
ohm_c
False
>>>
normalize
[
'NFC'
,
ohm
]
==
normalize
[
'NFC'
,
ohm_c
]
True
13 [_______96]. 7>>>
from
unicodedata
import
normalize
>>>
s1
=
'café'
>>>
s2
=
'cafe
\N{COMBINING ACUTE ACCENT}
'
>>>
len
[
s1
],
len
[
s2
]
[4, 5]
>>>
len
[
normalize
[
'NFC'
,
s1
]],
len
[
normalize
[
'NFC'
,
s2
]]
[4, 4]
>>>
len
[
normalize
[
'NFD'
,
s1
]],
len
[
normalize
[
'NFD'
,
s2
]]
[5, 5]
>>>
normalize
[
'NFC'
,
s1
]
==
normalize
[
'NFC'
,
s2
]
True
>>>
normalize
[
'NFD'
,
s1
]
==
normalize
[
'NFD'
,
s2
]
True
Đây là cách NFKC hoạt động trong thực tế
1>>>
from
unicodedata
import
normalize
>>>
s1
=
'café'
>>>
s2
=
'cafe
\N{COMBINING ACUTE ACCENT}
'
>>>
len
[
s1
],
len
[
s2
]
[4, 5]
>>>
len
[
normalize
[
'NFC'
,
s1
]],
len
[
normalize
[
'NFC'
,
s2
]]
[4, 4]
>>>
len
[
normalize
[
'NFD'
,
s1
]],
len
[
normalize
[
'NFD'
,
s2
]]
[5, 5]
>>>
normalize
[
'NFC'
,
s1
]
==
normalize
[
'NFC'
,
s2
]
True
>>>
normalize
[
'NFD'
,
s1
]
==
normalize
[
'NFD'
,
s2
]
True
Mặc dù
15 là một sự thay thế hợp lý cho>>>
from
unicodedata
import
normalize
>>>
s1
=
'café'
>>>
s2
=
'cafe
\N{COMBINING ACUTE ACCENT}
'
>>>
len
[
s1
],
len
[
s2
]
[4, 5]
>>>
len
[
normalize
[
'NFC'
,
s1
]],
len
[
normalize
[
'NFC'
,
s2
]]
[4, 4]
>>>
len
[
normalize
[
'NFD'
,
s1
]],
len
[
normalize
[
'NFD'
,
s2
]]
[5, 5]
>>>
normalize
[
'NFC'
,
s1
]
==
normalize
[
'NFC'
,
s2
]
True
>>>
normalize
[
'NFD'
,
s1
]
==
normalize
[
'NFD'
,
s2
]
True
8 và ký hiệu vi mô thực sự là một chữ thường trong tiếng Hy Lạp mu, việc chuyển đổi>>>
from
unicodedata
import
normalize
,
name
>>>
ohm
=
'
\u2126
'
>>>
name
[
ohm
]
'OHM SIGN'
>>>
ohm_c
=
normalize
[
'NFC'
,
ohm
]
>>>
name
[
ohm_c
]
'GREEK CAPITAL LETTER OMEGA'
>>>
ohm
==
ohm_c
False
>>>
normalize
[
'NFC'
,
ohm
]
==
normalize
[
'NFC'
,
ohm_c
]
True
17 thành>>>
from
unicodedata
import
normalize
>>>
s1
=
'café'
>>>
s2
=
'cafe
\N{COMBINING ACUTE ACCENT}
'
>>>
len
[
s1
],
len
[
s2
]
[4, 5]
>>>
len
[
normalize
[
'NFC'
,
s1
]],
len
[
normalize
[
'NFC'
,
s2
]]
[4, 4]
>>>
len
[
normalize
[
'NFD'
,
s1
]],
len
[
normalize
[
'NFD'
,
s2
]]
[5, 5]
>>>
normalize
[
'NFC'
,
s1
]
==
normalize
[
'NFC'
,
s2
]
True
>>>
normalize
[
'NFD'
,
s1
]
==
normalize
[
'NFD'
,
s2
]
True
18 sẽ thay đổi ý nghĩa. Một ứng dụng có thể lưu trữ>>>
from
unicodedata
import
normalize
>>>
s1
=
'café'
>>>
s2
=
'cafe
\N{COMBINING ACUTE ACCENT}
'
>>>
len
[
s1
],
len
[
s2
]
[4, 5]
>>>
len
[
normalize
[
'NFC'
,
s1
]],
len
[
normalize
[
'NFC'
,
s2
]]
[4, 4]
>>>
len
[
normalize
[
'NFD'
,
s1
]],
len
[
normalize
[
'NFD'
,
s2
]]
[5, 5]
>>>
normalize
[
'NFC'
,
s1
]
==
normalize
[
'NFC'
,
s2
]
True
>>>
normalize
[
'NFD'
,
s1
]
==
normalize
[
'NFD'
,
s2
]
True
17 dưới dạng>>>
from
unicodedata
import
normalize
>>>
s1
=
'café'
>>>
s2
=
'cafe
\N{COMBINING ACUTE ACCENT}
'
>>>
len
[
s1
],
len
[
s2
]
[4, 5]
>>>
len
[
normalize
[
'NFC'
,
s1
]],
len
[
normalize
[
'NFC'
,
s2
]]
[4, 4]
>>>
len
[
normalize
[
'NFD'
,
s1
]],
len
[
normalize
[
'NFD'
,
s2
]]
[5, 5]
>>>
normalize
[
'NFC'
,
s1
]
==
normalize
[
'NFC'
,
s2
]
True
>>>
normalize
[
'NFD'
,
s1
]
==
normalize
[
'NFD'
,
s2
]
True
18, nhưng hàm>>>
from
unicodedata
import
normalize
>>>
s1
=
'café'
>>>
s2
=
'cafe
\N{COMBINING ACUTE ACCENT}
'
>>>
len
[
s1
],
len
[
s2
]
[4, 5]
>>>
len
[
normalize
[
'NFC'
,
s1
]],
len
[
normalize
[
'NFC'
,
s2
]]
[4, 4]
>>>
len
[
normalize
[
'NFD'
,
s1
]],
len
[
normalize
[
'NFD'
,
s2
]]
[5, 5]
>>>
normalize
[
'NFC'
,
s1
]
==
normalize
[
'NFC'
,
s2
]
True
>>>
normalize
[
'NFD'
,
s1
]
==
normalize
[
'NFD'
,
s2
]
True
31 không biết gì về định dạng. Do đó, NFKC hoặc NFKD có thể làm mất hoặc bóp méo thông tin, nhưng chúng có thể tạo ra các biểu diễn trung gian thuận tiện để tìm kiếm và lập chỉ mục>>>
from
unicodedata
import
normalize
>>>
s1
=
'café'
>>>
s2
=
'cafe
\N{COMBINING ACUTE ACCENT}
'
>>>
len
[
s1
],
len
[
s2
]
[4, 5]
>>>
len
[
normalize
[
'NFC'
,
s1
]],
len
[
normalize
[
'NFC'
,
s2
]]
[4, 4]
>>>
len
[
normalize
[
'NFD'
,
s1
]],
len
[
normalize
[
'NFD'
,
s2
]]
[5, 5]
>>>
normalize
[
'NFC'
,
s1
]
==
normalize
[
'NFC'
,
s2
]
True
>>>
normalize
[
'NFD'
,
s1
]
==
normalize
[
'NFD'
,
s2
]
True
Thật không may, với Unicode, mọi thứ luôn phức tạp hơn lúc đầu. Đối với
32, quá trình chuẩn hóa NFKC đã tạo ra 1 và 2 được nối bởi>>>
from
unicodedata
import
normalize
>>>
s1
=
'café'
>>>
s2
=
'cafe
\N{COMBINING ACUTE ACCENT}
'
>>>
len
[
s1
],
len
[
s2
]
[4, 5]
>>>
len
[
normalize
[
'NFC'
,
s1
]],
len
[
normalize
[
'NFC'
,
s2
]]
[4, 4]
>>>
len
[
normalize
[
'NFD'
,
s1
]],
len
[
normalize
[
'NFD'
,
s2
]]
[5, 5]
>>>
normalize
[
'NFC'
,
s1
]
==
normalize
[
'NFC'
,
s2
]
True
>>>
normalize
[
'NFD'
,
s1
]
==
normalize
[
'NFD'
,
s2
]
True
33, thay vì>>>
from
unicodedata
import
normalize
>>>
s1
=
'café'
>>>
s2
=
'cafe
\N{COMBINING ACUTE ACCENT}
'
>>>
len
[
s1
],
len
[
s2
]
[4, 5]
>>>
len
[
normalize
[
'NFC'
,
s1
]],
len
[
normalize
[
'NFC'
,
s2
]]
[4, 4]
>>>
len
[
normalize
[
'NFD'
,
s1
]],
len
[
normalize
[
'NFD'
,
s2
]]
[5, 5]
>>>
normalize
[
'NFC'
,
s1
]
==
normalize
[
'NFC'
,
s2
]
True
>>>
normalize
[
'NFD'
,
s1
]
==
normalize
[
'NFD'
,
s2
]
True
34, một. k. a. “dấu gạch chéo”—ký tự quen thuộc với mã ASCII thập phân 47. Do đó, tìm kiếm chuỗi ASCII ba ký tự>>>
from
unicodedata
import
normalize
>>>
s1
=
'café'
>>>
s2
=
'cafe
\N{COMBINING ACUTE ACCENT}
'
>>>
len
[
s1
],
len
[
s2
]
[4, 5]
>>>
len
[
normalize
[
'NFC'
,
s1
]],
len
[
normalize
[
'NFC'
,
s2
]]
[4, 4]
>>>
len
[
normalize
[
'NFD'
,
s1
]],
len
[
normalize
[
'NFD'
,
s2
]]
[5, 5]
>>>
normalize
[
'NFC'
,
s1
]
==
normalize
[
'NFC'
,
s2
]
True
>>>
normalize
[
'NFD'
,
s1
]
==
normalize
[
'NFD'
,
s2
]
True
10 sẽ không tìm thấy chuỗi Unicode chuẩn hóa>>>
from
unicodedata
import
normalize
>>>
s1
=
'café'
>>>
s2
=
'cafe
\N{COMBINING ACUTE ACCENT}
'
>>>
len
[
s1
],
len
[
s2
]
[4, 5]
>>>
len
[
normalize
[
'NFC'
,
s1
]],
len
[
normalize
[
'NFC'
,
s2
]]
[4, 4]
>>>
len
[
normalize
[
'NFD'
,
s1
]],
len
[
normalize
[
'NFD'
,
s2
]]
[5, 5]
>>>
normalize
[
'NFC'
,
s1
]
==
normalize
[
'NFC'
,
s2
]
True
>>>
normalize
[
'NFD'
,
s1
]
==
normalize
[
'NFD'
,
s2
]
True
Cảnh báo
Chuẩn hóa NFKC và NFKD gây mất dữ liệu và chỉ nên được áp dụng trong các trường hợp đặc biệt như tìm kiếm và lập chỉ mục chứ không phải để lưu trữ văn bản vĩnh viễn
Khi chuẩn bị văn bản để tìm kiếm hoặc lập chỉ mục, một thao tác khác sẽ hữu ích. gấp trường hợp, chủ đề tiếp theo của chúng tôi
Trường hợp gấp
Trường hợp gấp về cơ bản là chuyển đổi tất cả văn bản thành chữ thường, với một số biến đổi bổ sung. Nó được hỗ trợ bởi phương pháp
36>>>
from
unicodedata
import
normalize
>>>
s1
=
'café'
>>>
s2
=
'cafe
\N{COMBINING ACUTE ACCENT}
'
>>>
len
[
s1
],
len
[
s2
]
[4, 5]
>>>
len
[
normalize
[
'NFC'
,
s1
]],
len
[
normalize
[
'NFC'
,
s2
]]
[4, 4]
>>>
len
[
normalize
[
'NFD'
,
s1
]],
len
[
normalize
[
'NFD'
,
s2
]]
[5, 5]
>>>
normalize
[
'NFC'
,
s1
]
==
normalize
[
'NFC'
,
s2
]
True
>>>
normalize
[
'NFD'
,
s1
]
==
normalize
[
'NFD'
,
s2
]
True
Đối với bất kỳ chuỗi
37 nào chỉ chứa>>>
from
unicodedata
import
normalize
>>>
s1
=
'café'
>>>
s2
=
'cafe
\N{COMBINING ACUTE ACCENT}
'
>>>
len
[
s1
],
len
[
s2
]
[4, 5]
>>>
len
[
normalize
[
'NFC'
,
s1
]],
len
[
normalize
[
'NFC'
,
s2
]]
[4, 4]
>>>
len
[
normalize
[
'NFD'
,
s1
]],
len
[
normalize
[
'NFD'
,
s2
]]
[5, 5]
>>>
normalize
[
'NFC'
,
s1
]
==
normalize
[
'NFC'
,
s2
]
True
>>>
normalize
[
'NFD'
,
s1
]
==
normalize
[
'NFD'
,
s2
]
True
5 ký tự,>>>
from
unicodedata
import
normalize
,
name
>>>
ohm
=
'
\u2126
'
>>>
name
[
ohm
]
'OHM SIGN'
>>>
ohm_c
=
normalize
[
'NFC'
,
ohm
]
>>>
name
[
ohm_c
]
'GREEK CAPITAL LETTER OMEGA'
>>>
ohm
==
ohm_c
False
>>>
normalize
[
'NFC'
,
ohm
]
==
normalize
[
'NFC'
,
ohm_c
]
True
39 tạo ra kết quả giống như>>>
from
unicodedata
import
normalize
>>>
s1
=
'café'
>>>
s2
=
'cafe
\N{COMBINING ACUTE ACCENT}
'
>>>
len
[
s1
],
len
[
s2
]
[4, 5]
>>>
len
[
normalize
[
'NFC'
,
s1
]],
len
[
normalize
[
'NFC'
,
s2
]]
[4, 4]
>>>
len
[
normalize
[
'NFD'
,
s1
]],
len
[
normalize
[
'NFD'
,
s2
]]
[5, 5]
>>>
normalize
[
'NFC'
,
s1
]
==
normalize
[
'NFC'
,
s2
]
True
>>>
normalize
[
'NFD'
,
s1
]
==
normalize
[
'NFD'
,
s2
]
True
20, chỉ có hai ngoại lệ—ký hiệu vi mô>>>
from
unicodedata
import
normalize
>>>
s1
=
'café'
>>>
s2
=
'cafe
\N{COMBINING ACUTE ACCENT}
'
>>>
len
[
s1
],
len
[
s2
]
[4, 5]
>>>
len
[
normalize
[
'NFC'
,
s1
]],
len
[
normalize
[
'NFC'
,
s2
]]
[4, 4]
>>>
len
[
normalize
[
'NFD'
,
s1
]],
len
[
normalize
[
'NFD'
,
s2
]]
[5, 5]
>>>
normalize
[
'NFC'
,
s1
]
==
normalize
[
'NFC'
,
s2
]
True
>>>
normalize
[
'NFD'
,
s1
]
==
normalize
[
'NFD'
,
s2
]
True
11 được đổi thành chữ thường mu của Hy Lạp [trông giống nhau ở hầu hết các phông chữ] và chữ Eszett của Đức hoặc “sharp s>>>
from
unicodedata
import
normalize
>>>
s1
=
'café'
>>>
s2
=
'cafe
\N{COMBINING ACUTE ACCENT}
'
>>>
len
[
s1
],
len
[
s2
]
[4, 5]
>>>
len
[
normalize
[
'NFC'
,
s1
]],
len
[
normalize
[
'NFC'
,
s2
]]
[4, 4]
>>>
len
[
normalize
[
'NFD'
,
s1
]],
len
[
normalize
[
'NFD'
,
s2
]]
[5, 5]
>>>
normalize
[
'NFC'
,
s1
]
==
normalize
[
'NFC'
,
s2
]
True
>>>
normalize
[
'NFD'
,
s1
]
==
normalize
[
'NFD'
,
s2
]
True
3>>>
from
unicodedata
import
normalize
>>>
s1
=
'café'
>>>
s2
=
'cafe
\N{COMBINING ACUTE ACCENT}
'
>>>
len
[
s1
],
len
[
s2
]
[4, 5]
>>>
len
[
normalize
[
'NFC'
,
s1
]],
len
[
normalize
[
'NFC'
,
s2
]]
[4, 4]
>>>
len
[
normalize
[
'NFD'
,
s1
]],
len
[
normalize
[
'NFD'
,
s2
]]
[5, 5]
>>>
normalize
[
'NFC'
,
s1
]
==
normalize
[
'NFC'
,
s2
]
True
>>>
normalize
[
'NFD'
,
s1
]
==
normalize
[
'NFD'
,
s2
]
True
Có gần 300 điểm mã mà
36 và>>>
from
unicodedata
import
normalize
>>>
s1
=
'café'
>>>
s2
=
'cafe
\N{COMBINING ACUTE ACCENT}
'
>>>
len
[
s1
],
len
[
s2
]
[4, 5]
>>>
len
[
normalize
[
'NFC'
,
s1
]],
len
[
normalize
[
'NFC'
,
s2
]]
[4, 4]
>>>
len
[
normalize
[
'NFD'
,
s1
]],
len
[
normalize
[
'NFD'
,
s2
]]
[5, 5]
>>>
normalize
[
'NFC'
,
s1
]
==
normalize
[
'NFC'
,
s2
]
True
>>>
normalize
[
'NFD'
,
s1
]
==
normalize
[
'NFD'
,
s2
]
True
23 trả về các kết quả khác nhau>>>
from
unicodedata
import
normalize
>>>
s1
=
'café'
>>>
s2
=
'cafe
\N{COMBINING ACUTE ACCENT}
'
>>>
len
[
s1
],
len
[
s2
]
[4, 5]
>>>
len
[
normalize
[
'NFC'
,
s1
]],
len
[
normalize
[
'NFC'
,
s2
]]
[4, 4]
>>>
len
[
normalize
[
'NFD'
,
s1
]],
len
[
normalize
[
'NFD'
,
s2
]]
[5, 5]
>>>
normalize
[
'NFC'
,
s1
]
==
normalize
[
'NFC'
,
s2
]
True
>>>
normalize
[
'NFD'
,
s1
]
==
normalize
[
'NFD'
,
s2
]
True
Như thường lệ với bất cứ điều gì liên quan đến Unicode, trường hợp gấp là một vấn đề khó khăn với nhiều trường hợp đặc biệt về ngôn ngữ, nhưng nhóm cốt lõi của Python đã nỗ lực cung cấp một giải pháp hy vọng sẽ phù hợp với hầu hết người dùng
Trong vài phần tiếp theo, chúng ta sẽ sử dụng kiến thức chuẩn hóa của mình để phát triển các hàm tiện ích
Các chức năng tiện ích để so khớp văn bản được chuẩn hóa
Như chúng ta đã thấy, NFC và NFD an toàn khi sử dụng và cho phép so sánh hợp lý giữa các chuỗi Unicode. NFC là hình thức chuẩn hóa tốt nhất cho hầu hết các ứng dụng.
36 là cách để so sánh không phân biệt chữ hoa chữ thường>>>
from
unicodedata
import
normalize
>>>
s1
=
'café'
>>>
s2
=
'cafe
\N{COMBINING ACUTE ACCENT}
'
>>>
len
[
s1
],
len
[
s2
]
[4, 5]
>>>
len
[
normalize
[
'NFC'
,
s1
]],
len
[
normalize
[
'NFC'
,
s2
]]
[4, 4]
>>>
len
[
normalize
[
'NFD'
,
s1
]],
len
[
normalize
[
'NFD'
,
s2
]]
[5, 5]
>>>
normalize
[
'NFC'
,
s1
]
==
normalize
[
'NFC'
,
s2
]
True
>>>
normalize
[
'NFD'
,
s1
]
==
normalize
[
'NFD'
,
s2
]
True
Nếu bạn làm việc với văn bản ở nhiều ngôn ngữ, thì một cặp hàm như
25 và>>>
from
unicodedata
import
normalize
>>>
s1
=
'café'
>>>
s2
=
'cafe
\N{COMBINING ACUTE ACCENT}
'
>>>
len
[
s1
],
len
[
s2
]
[4, 5]
>>>
len
[
normalize
[
'NFC'
,
s1
]],
len
[
normalize
[
'NFC'
,
s2
]]
[4, 4]
>>>
len
[
normalize
[
'NFD'
,
s1
]],
len
[
normalize
[
'NFD'
,
s2
]]
[5, 5]
>>>
normalize
[
'NFC'
,
s1
]
==
normalize
[
'NFC'
,
s2
]
True
>>>
normalize
[
'NFD'
,
s1
]
==
normalize
[
'NFD'
,
s2
]
True
26 trong Ví dụ 4-13 là những bổ sung hữu ích cho hộp công cụ của bạn>>>
from
unicodedata
import
normalize
>>>
s1
=
'café'
>>>
s2
=
'cafe
\N{COMBINING ACUTE ACCENT}
'
>>>
len
[
s1
],
len
[
s2
]
[4, 5]
>>>
len
[
normalize
[
'NFC'
,
s1
]],
len
[
normalize
[
'NFC'
,
s2
]]
[4, 4]
>>>
len
[
normalize
[
'NFD'
,
s1
]],
len
[
normalize
[
'NFD'
,
s2
]]
[5, 5]
>>>
normalize
[
'NFC'
,
s1
]
==
normalize
[
'NFC'
,
s2
]
True
>>>
normalize
[
'NFD'
,
s1
]
==
normalize
[
'NFD'
,
s2
]
True
Ví dụ 4-13. bình thường. py. so sánh chuỗi Unicode chuẩn hóa
2>>>
from
unicodedata
import
normalize
>>>
s1
=
'café'
>>>
s2
=
'cafe
\N{COMBINING ACUTE ACCENT}
'
>>>
len
[
s1
],
len
[
s2
]
[4, 5]
>>>
len
[
normalize
[
'NFC'
,
s1
]],
len
[
normalize
[
'NFC'
,
s2
]]
[4, 4]
>>>
len
[
normalize
[
'NFD'
,
s1
]],
len
[
normalize
[
'NFD'
,
s2
]]
[5, 5]
>>>
normalize
[
'NFC'
,
s1
]
==
normalize
[
'NFC'
,
s2
]
True
>>>
normalize
[
'NFD'
,
s1
]
==
normalize
[
'NFD'
,
s2
]
True
Ngoài chuẩn hóa Unicode và gấp trường hợp—cả hai đều là một phần của tiêu chuẩn Unicode—đôi khi áp dụng các phép biến đổi sâu hơn, chẳng hạn như thay đổi
27 thành>>>
from
unicodedata
import
normalize
>>>
s1
=
'café'
>>>
s2
=
'cafe
\N{COMBINING ACUTE ACCENT}
'
>>>
len
[
s1
],
len
[
s2
]
[4, 5]
>>>
len
[
normalize
[
'NFC'
,
s1
]],
len
[
normalize
[
'NFC'
,
s2
]]
[4, 4]
>>>
len
[
normalize
[
'NFD'
,
s1
]],
len
[
normalize
[
'NFD'
,
s2
]]
[5, 5]
>>>
normalize
[
'NFC'
,
s1
]
==
normalize
[
'NFC'
,
s2
]
True
>>>
normalize
[
'NFD'
,
s1
]
==
normalize
[
'NFD'
,
s2
]
True
28 là điều hợp lý. Chúng ta sẽ xem khi nào và như thế nào trong phần tiếp theo>>>
from
unicodedata
import
normalize
>>>
s1
=
'café'
>>>
s2
=
'cafe
\N{COMBINING ACUTE ACCENT}
'
>>>
len
[
s1
],
len
[
s2
]
[4, 5]
>>>
len
[
normalize
[
'NFC'
,
s1
]],
len
[
normalize
[
'NFC'
,
s2
]]
[4, 4]
>>>
len
[
normalize
[
'NFD'
,
s1
]],
len
[
normalize
[
'NFD'
,
s2
]]
[5, 5]
>>>
normalize
[
'NFC'
,
s1
]
==
normalize
[
'NFC'
,
s2
]
True
>>>
normalize
[
'NFD'
,
s1
]
==
normalize
[
'NFD'
,
s2
]
True
Cực kỳ “bình thường hóa”. Loại bỏ dấu phụ
Nước sốt bí mật của Google Tìm kiếm liên quan đến nhiều thủ thuật, nhưng một trong số đó rõ ràng là bỏ qua các dấu phụ [e. g. , trọng âm, cedillas, v.v. ], ít nhất là trong một số bối cảnh. Xóa dấu phụ không phải là một hình thức chuẩn hóa thích hợp vì nó thường làm thay đổi nghĩa của từ và có thể tạo ra kết quả dương tính giả khi tìm kiếm. Nhưng nó giúp đối phó với một số sự thật của cuộc sống. mọi người đôi khi lười biếng hoặc không biết gì về việc sử dụng đúng các dấu phụ và các quy tắc chính tả thay đổi theo thời gian, có nghĩa là các dấu xuất hiện và biến mất trong ngôn ngữ sống
Ngoài việc tìm kiếm, việc loại bỏ các dấu phụ cũng giúp các URL dễ đọc hơn, ít nhất là bằng các ngôn ngữ gốc Latinh. Hãy xem URL của bài viết trên Wikipedia về thành phố São Paulo
3>>>
from
unicodedata
import
normalize
>>>
s1
=
'café'
>>>
s2
=
'cafe
\N{COMBINING ACUTE ACCENT}
'
>>>
len
[
s1
],
len
[
s2
]
[4, 5]
>>>
len
[
normalize
[
'NFC'
,
s1
]],
len
[
normalize
[
'NFC'
,
s2
]]
[4, 4]
>>>
len
[
normalize
[
'NFD'
,
s1
]],
len
[
normalize
[
'NFD'
,
s2
]]
[5, 5]
>>>
normalize
[
'NFC'
,
s1
]
==
normalize
[
'NFC'
,
s2
]
True
>>>
normalize
[
'NFD'
,
s1
]
==
normalize
[
'NFD'
,
s2
]
True
Phần
29 là kết xuất UTF-8 thoát URL của chữ cái đơn “ã” [“a” có dấu ngã]. Những điều sau đây dễ nhận ra hơn nhiều, ngay cả khi nó không đúng chính tả>>>
from
unicodedata
import
normalize
>>>
s1
=
'café'
>>>
s2
=
'cafe
\N{COMBINING ACUTE ACCENT}
'
>>>
len
[
s1
],
len
[
s2
]
[4, 5]
>>>
len
[
normalize
[
'NFC'
,
s1
]],
len
[
normalize
[
'NFC'
,
s2
]]
[4, 4]
>>>
len
[
normalize
[
'NFD'
,
s1
]],
len
[
normalize
[
'NFD'
,
s2
]]
[5, 5]
>>>
normalize
[
'NFC'
,
s1
]
==
normalize
[
'NFC'
,
s2
]
True
>>>
normalize
[
'NFD'
,
s1
]
==
normalize
[
'NFD'
,
s2
]
True
5>>>
from
unicodedata
import
normalize
>>>
s1
=
'café'
>>>
s2
=
'cafe
\N{COMBINING ACUTE ACCENT}
'
>>>
len
[
s1
],
len
[
s2
]
[4, 5]
>>>
len
[
normalize
[
'NFC'
,
s1
]],
len
[
normalize
[
'NFC'
,
s2
]]
[4, 4]
>>>
len
[
normalize
[
'NFD'
,
s1
]],
len
[
normalize
[
'NFD'
,
s2
]]
[5, 5]
>>>
normalize
[
'NFC'
,
s1
]
==
normalize
[
'NFC'
,
s2
]
True
>>>
normalize
[
'NFD'
,
s1
]
==
normalize
[
'NFD'
,
s2
]
True
Để xóa tất cả các dấu phụ khỏi
30, bạn có thể sử dụng hàm như Ví dụ 4-14>>>
from
unicodedata
import
normalize
>>>
s1
=
'café'
>>>
s2
=
'cafe
\N{COMBINING ACUTE ACCENT}
'
>>>
len
[
s1
],
len
[
s2
]
[4, 5]
>>>
len
[
normalize
[
'NFC'
,
s1
]],
len
[
normalize
[
'NFC'
,
s2
]]
[4, 4]
>>>
len
[
normalize
[
'NFD'
,
s1
]],
len
[
normalize
[
'NFD'
,
s2
]]
[5, 5]
>>>
normalize
[
'NFC'
,
s1
]
==
normalize
[
'NFC'
,
s2
]
True
>>>
normalize
[
'NFD'
,
s1
]
==
normalize
[
'NFD'
,
s2
]
True
Ví dụ 4-14. đơn giản hóa. py. chức năng loại bỏ tất cả các dấu kết hợp
7>>>
from
unicodedata
import
normalize
>>>
s1
=
'café'
>>>
s2
=
'cafe
\N{COMBINING ACUTE ACCENT}
'
>>>
len
[
s1
],
len
[
s2
]
[4, 5]
>>>
len
[
normalize
[
'NFC'
,
s1
]],
len
[
normalize
[
'NFC'
,
s2
]]
[4, 4]
>>>
len
[
normalize
[
'NFD'
,
s1
]],
len
[
normalize
[
'NFD'
,
s2
]]
[5, 5]
>>>
normalize
[
'NFC'
,
s1
]
==
normalize
[
'NFC'
,
s2
]
True
>>>
normalize
[
'NFD'
,
s1
]
==
normalize
[
'NFD'
,
s2
]
True
Phân tách tất cả các ký tự thành các ký tự cơ bản và kết hợp các dấu
Lọc ra tất cả các dấu kết hợp
Soạn lại tất cả các ký tự
Ví dụ 4-15 cho thấy một số cách sử dụng của
31>>>
from
unicodedata
import
normalize
>>>
s1
=
'café'
>>>
s2
=
'cafe
\N{COMBINING ACUTE ACCENT}
'
>>>
len
[
s1
],
len
[
s2
]
[4, 5]
>>>
len
[
normalize
[
'NFC'
,
s1
]],
len
[
normalize
[
'NFC'
,
s2
]]
[4, 4]
>>>
len
[
normalize
[
'NFD'
,
s1
]],
len
[
normalize
[
'NFD'
,
s2
]]
[5, 5]
>>>
normalize
[
'NFC'
,
s1
]
==
normalize
[
'NFC'
,
s2
]
True
>>>
normalize
[
'NFD'
,
s1
]
==
normalize
[
'NFD'
,
s2
]
True
Ví dụ 4-15. Hai ví dụ sử dụng
31 từ Ví dụ 4-14>>>
from
unicodedata
import
normalize
>>>
s1
=
'café'
>>>
s2
=
'cafe
\N{COMBINING ACUTE ACCENT}
'
>>>
len
[
s1
],
len
[
s2
]
[4, 5]
>>>
len
[
normalize
[
'NFC'
,
s1
]],
len
[
normalize
[
'NFC'
,
s2
]]
[4, 4]
>>>
len
[
normalize
[
'NFD'
,
s1
]],
len
[
normalize
[
'NFD'
,
s2
]]
[5, 5]
>>>
normalize
[
'NFC'
,
s1
]
==
normalize
[
'NFC'
,
s2
]
True
>>>
normalize
[
'NFD'
,
s1
]
==
normalize
[
'NFD'
,
s2
]
True
0>>>
from
unicodedata
import
normalize
>>>
s1
=
'café'
>>>
s2
=
'cafe
\N{COMBINING ACUTE ACCENT}
'
>>>
len
[
s1
],
len
[
s2
]
[4, 5]
>>>
len
[
normalize
[
'NFC'
,
s1
]],
len
[
normalize
[
'NFC'
,
s2
]]
[4, 4]
>>>
len
[
normalize
[
'NFD'
,
s1
]],
len
[
normalize
[
'NFD'
,
s2
]]
[5, 5]
>>>
normalize
[
'NFC'
,
s1
]
==
normalize
[
'NFC'
,
s2
]
True
>>>
normalize
[
'NFD'
,
s1
]
==
normalize
[
'NFD'
,
s2
]
True
Chỉ có các chữ cái “è”, “ç” và “í” được thay thế
Cả “έ” và “é” đều được thay thế
Hàm
31 từ Ví dụ 4-14 hoạt động bình thường, nhưng có lẽ nó đi quá xa. Thông thường, lý do để loại bỏ các dấu phụ là để thay đổi văn bản Latinh thành ASCII thuần túy, nhưng>>>
from
unicodedata
import
normalize
>>>
s1
=
'café'
>>>
s2
=
'cafe
\N{COMBINING ACUTE ACCENT}
'
>>>
len
[
s1
],
len
[
s2
]
[4, 5]
>>>
len
[
normalize
[
'NFC'
,
s1
]],
len
[
normalize
[
'NFC'
,
s2
]]
[4, 4]
>>>
len
[
normalize
[
'NFD'
,
s1
]],
len
[
normalize
[
'NFD'
,
s2
]]
[5, 5]
>>>
normalize
[
'NFC'
,
s1
]
==
normalize
[
'NFC'
,
s2
]
True
>>>
normalize
[
'NFD'
,
s1
]
==
normalize
[
'NFD'
,
s2
]
True
31 cũng thay đổi các ký tự không phải là Latinh—như các chữ cái Hy Lạp—sẽ không bao giờ trở thành ASCII chỉ bằng cách mất dấu của chúng. Vì vậy, thật hợp lý khi phân tích từng ký tự cơ bản và chỉ xóa các dấu đính kèm nếu ký tự cơ sở là một chữ cái trong bảng chữ cái Latinh. Đây là những gì Ví dụ 4-16 thực hiện>>>
from
unicodedata
import
normalize
>>>
s1
=
'café'
>>>
s2
=
'cafe
\N{COMBINING ACUTE ACCENT}
'
>>>
len
[
s1
],
len
[
s2
]
[4, 5]
>>>
len
[
normalize
[
'NFC'
,
s1
]],
len
[
normalize
[
'NFC'
,
s2
]]
[4, 4]
>>>
len
[
normalize
[
'NFD'
,
s1
]],
len
[
normalize
[
'NFD'
,
s2
]]
[5, 5]
>>>
normalize
[
'NFC'
,
s1
]
==
normalize
[
'NFC'
,
s2
]
True
>>>
normalize
[
'NFD'
,
s1
]
==
normalize
[
'NFD'
,
s2
]
True
Ví dụ 4-16. Chức năng loại bỏ các dấu kết hợp khỏi các ký tự Latinh [các câu lệnh nhập được bỏ qua vì đây là một phần của chức năng đơn giản hóa. py từ Ví dụ 4-14]
0>>>
from
unicodedata
import
normalize
>>>
s1
=
'café'
>>>
s2
=
'cafe
\N{COMBINING ACUTE ACCENT}
'
>>>
len
[
s1
],
len
[
s2
]
[4, 5]
>>>
len
[
normalize
[
'NFC'
,
s1
]],
len
[
normalize
[
'NFC'
,
s2
]]
[4, 4]
>>>
len
[
normalize
[
'NFD'
,
s1
]],
len
[
normalize
[
'NFD'
,
s2
]]
[5, 5]
>>>
normalize
[
'NFC'
,
s1
]
==
normalize
[
'NFC'
,
s2
]
True
>>>
normalize
[
'NFD'
,
s1
]
==
normalize
[
'NFD'
,
s2
]
True
Phân tách tất cả các ký tự thành các ký tự cơ bản và kết hợp các dấu
Bỏ qua các dấu kết hợp khi ký tự cơ sở là tiếng Latinh
Nếu không, hãy giữ ký tự hiện tại
Phát hiện ký tự cơ sở mới và xác định xem đó có phải là tiếng Latinh không
Soạn lại tất cả các ký tự
Một bước thậm chí triệt để hơn sẽ là thay thế các ký hiệu phổ biến trong các văn bản phương Tây [e. g. , dấu ngoặc kép, dấu gạch ngang, dấu đầu dòng, v.v. ] thành
35 tương đương. Đây là chức năng của hàm>>>
from
unicodedata
import
normalize
>>>
s1
=
'café'
>>>
s2
=
'cafe
\N{COMBINING ACUTE ACCENT}
'
>>>
len
[
s1
],
len
[
s2
]
[4, 5]
>>>
len
[
normalize
[
'NFC'
,
s1
]],
len
[
normalize
[
'NFC'
,
s2
]]
[4, 4]
>>>
len
[
normalize
[
'NFD'
,
s1
]],
len
[
normalize
[
'NFD'
,
s2
]]
[5, 5]
>>>
normalize
[
'NFC'
,
s1
]
==
normalize
[
'NFC'
,
s2
]
True
>>>
normalize
[
'NFD'
,
s1
]
==
normalize
[
'NFD'
,
s2
]
True
36 trong Ví dụ 4-17>>>
from
unicodedata
import
normalize
>>>
s1
=
'café'
>>>
s2
=
'cafe
\N{COMBINING ACUTE ACCENT}
'
>>>
len
[
s1
],
len
[
s2
]
[4, 5]
>>>
len
[
normalize
[
'NFC'
,
s1
]],
len
[
normalize
[
'NFC'
,
s2
]]
[4, 4]
>>>
len
[
normalize
[
'NFD'
,
s1
]],
len
[
normalize
[
'NFD'
,
s2
]]
[5, 5]
>>>
normalize
[
'NFC'
,
s1
]
==
normalize
[
'NFC'
,
s2
]
True
>>>
normalize
[
'NFD'
,
s1
]
==
normalize
[
'NFD'
,
s2
]
True
Ví dụ 4-17. Chuyển đổi một số ký hiệu đánh máy phương Tây thành ASCII [đoạn mã này cũng là một phần của công cụ đơn giản hóa. py từ Ví dụ 4-14]
1>>>
from
unicodedata
import
normalize
>>>
s1
=
'café'
>>>
s2
=
'cafe
\N{COMBINING ACUTE ACCENT}
'
>>>
len
[
s1
],
len
[
s2
]
[4, 5]
>>>
len
[
normalize
[
'NFC'
,
s1
]],
len
[
normalize
[
'NFC'
,
s2
]]
[4, 4]
>>>
len
[
normalize
[
'NFD'
,
s1
]],
len
[
normalize
[
'NFD'
,
s2
]]
[5, 5]
>>>
normalize
[
'NFC'
,
s1
]
==
normalize
[
'NFC'
,
s2
]
True
>>>
normalize
[
'NFD'
,
s1
]
==
normalize
[
'NFD'
,
s2
]
True
Xây dựng bảng ánh xạ để thay thế char-to-char
Xây dựng bảng ánh xạ để thay thế chuỗi ký tự
Hợp nhất các bảng ánh xạ
37 không ảnh hưởng đến văn bản>>>
from
unicodedata
import
normalize
>>>
s1
=
'café'
>>>
s2
=
'cafe
\N{COMBINING ACUTE ACCENT}
'
>>>
len
[
s1
],
len
[
s2
]
[4, 5]
>>>
len
[
normalize
[
'NFC'
,
s1
]],
len
[
normalize
[
'NFC'
,
s2
]]
[4, 4]
>>>
len
[
normalize
[
'NFD'
,
s1
]],
len
[
normalize
[
'NFD'
,
s2
]]
[5, 5]
>>>
normalize
[
'NFC'
,
s1
]
==
normalize
[
'NFC'
,
s2
]
True
>>>
normalize
[
'NFD'
,
s1
]
==
normalize
[
'NFD'
,
s2
]
True
35 hoặc>>>
from
unicodedata
import
normalize
>>>
s1
=
'café'
>>>
s2
=
'cafe
\N{COMBINING ACUTE ACCENT}
'
>>>
len
[
s1
],
len
[
s2
]
[4, 5]
>>>
len
[
normalize
[
'NFC'
,
s1
]],
len
[
normalize
[
'NFC'
,
s2
]]
[4, 4]
>>>
len
[
normalize
[
'NFD'
,
s1
]],
len
[
normalize
[
'NFD'
,
s2
]]
[5, 5]
>>>
normalize
[
'NFC'
,
s1
]
==
normalize
[
'NFC'
,
s2
]
True
>>>
normalize
[
'NFD'
,
s1
]
==
normalize
[
'NFD'
,
s2
]
True
5, chỉ những phần bổ sung của Microsoft cho>>>
from
unicodedata
import
normalize
,
name
>>>
ohm
=
'
\u2126
'
>>>
name
[
ohm
]
'OHM SIGN'
>>>
ohm_c
=
normalize
[
'NFC'
,
ohm
]
>>>
name
[
ohm_c
]
'GREEK CAPITAL LETTER OMEGA'
>>>
ohm
==
ohm_c
False
>>>
normalize
[
'NFC'
,
ohm
]
==
normalize
[
'NFC'
,
ohm_c
]
True
5 trong>>>
from
unicodedata
import
normalize
,
name
>>>
ohm
=
'
\u2126
'
>>>
name
[
ohm
]
'OHM SIGN'
>>>
ohm_c
=
normalize
[
'NFC'
,
ohm
]
>>>
name
[
ohm_c
]
'GREEK CAPITAL LETTER OMEGA'
>>>
ohm
==
ohm_c
False
>>>
normalize
[
'NFC'
,
ohm
]
==
normalize
[
'NFC'
,
ohm_c
]
True
51>>>
from
unicodedata
import
normalize
>>>
s1
=
'café'
>>>
s2
=
'cafe
\N{COMBINING ACUTE ACCENT}
'
>>>
len
[
s1
],
len
[
s2
]
[4, 5]
>>>
len
[
normalize
[
'NFC'
,
s1
]],
len
[
normalize
[
'NFC'
,
s2
]]
[4, 4]
>>>
len
[
normalize
[
'NFD'
,
s1
]],
len
[
normalize
[
'NFD'
,
s2
]]
[5, 5]
>>>
normalize
[
'NFC'
,
s1
]
==
normalize
[
'NFC'
,
s2
]
True
>>>
normalize
[
'NFD'
,
s1
]
==
normalize
[
'NFD'
,
s2
]
True
Áp dụng
37 và xóa dấu phụ>>>
from
unicodedata
import
normalize
>>>
s1
=
'café'
>>>
s2
=
'cafe
\N{COMBINING ACUTE ACCENT}
'
>>>
len
[
s1
],
len
[
s2
]
[4, 5]
>>>
len
[
normalize
[
'NFC'
,
s1
]],
len
[
normalize
[
'NFC'
,
s2
]]
[4, 4]
>>>
len
[
normalize
[
'NFD'
,
s1
]],
len
[
normalize
[
'NFD'
,
s2
]]
[5, 5]
>>>
normalize
[
'NFC'
,
s1
]
==
normalize
[
'NFC'
,
s2
]
True
>>>
normalize
[
'NFD'
,
s1
]
==
normalize
[
'NFD'
,
s2
]
True
Thay thế Eszett bằng “ss” [chúng tôi không sử dụng trường hợp gấp ở đây vì chúng tôi muốn giữ nguyên trường hợp]
Áp dụng chuẩn hóa NFKC để soạn các ký tự với các điểm mã tương thích của chúng
Ví dụ 4-18 hiển thị
36 đang được sử dụng>>>
from
unicodedata
import
normalize
>>>
s1
=
'café'
>>>
s2
=
'cafe
\N{COMBINING ACUTE ACCENT}
'
>>>
len
[
s1
],
len
[
s2
]
[4, 5]
>>>
len
[
normalize
[
'NFC'
,
s1
]],
len
[
normalize
[
'NFC'
,
s2
]]
[4, 4]
>>>
len
[
normalize
[
'NFD'
,
s1
]],
len
[
normalize
[
'NFD'
,
s2
]]
[5, 5]
>>>
normalize
[
'NFC'
,
s1
]
==
normalize
[
'NFC'
,
s2
]
True
>>>
normalize
[
'NFD'
,
s1
]
==
normalize
[
'NFD'
,
s2
]
True
Ví dụ 4-18. Hai ví dụ sử dụng
36 từ Ví dụ 4-17>>>
from
unicodedata
import
normalize
>>>
s1
=
'café'
>>>
s2
=
'cafe
\N{COMBINING ACUTE ACCENT}
'
>>>
len
[
s1
],
len
[
s2
]
[4, 5]
>>>
len
[
normalize
[
'NFC'
,
s1
]],
len
[
normalize
[
'NFC'
,
s2
]]
[4, 4]
>>>
len
[
normalize
[
'NFD'
,
s1
]],
len
[
normalize
[
'NFD'
,
s2
]]
[5, 5]
>>>
normalize
[
'NFC'
,
s1
]
==
normalize
[
'NFC'
,
s2
]
True
>>>
normalize
[
'NFD'
,
s1
]
==
normalize
[
'NFD'
,
s2
]
True
2>>>
from
unicodedata
import
normalize
>>>
s1
=
'café'
>>>
s2
=
'cafe
\N{COMBINING ACUTE ACCENT}
'
>>>
len
[
s1
],
len
[
s2
]
[4, 5]
>>>
len
[
normalize
[
'NFC'
,
s1
]],
len
[
normalize
[
'NFC'
,
s2
]]
[4, 4]
>>>
len
[
normalize
[
'NFD'
,
s1
]],
len
[
normalize
[
'NFD'
,
s2
]]
[5, 5]
>>>
normalize
[
'NFC'
,
s1
]
==
normalize
[
'NFC'
,
s2
]
True
>>>
normalize
[
'NFD'
,
s1
]
==
normalize
[
'NFD'
,
s2
]
True
37 thay thế dấu nháy kép, dấu đầu dòng và ™ [ký hiệu nhãn hiệu]>>>
from
unicodedata
import
normalize
>>>
s1
=
'café'
>>>
s2
=
'cafe
\N{COMBINING ACUTE ACCENT}
'
>>>
len
[
s1
],
len
[
s2
]
[4, 5]
>>>
len
[
normalize
[
'NFC'
,
s1
]],
len
[
normalize
[
'NFC'
,
s2
]]
[4, 4]
>>>
len
[
normalize
[
'NFD'
,
s1
]],
len
[
normalize
[
'NFD'
,
s2
]]
[5, 5]
>>>
normalize
[
'NFC'
,
s1
]
==
normalize
[
'NFC'
,
s2
]
True
>>>
normalize
[
'NFD'
,
s1
]
==
normalize
[
'NFD'
,
s2
]
True
36 áp dụng>>>
from
unicodedata
import
normalize
>>>
s1
=
'café'
>>>
s2
=
'cafe
\N{COMBINING ACUTE ACCENT}
'
>>>
len
[
s1
],
len
[
s2
]
[4, 5]
>>>
len
[
normalize
[
'NFC'
,
s1
]],
len
[
normalize
[
'NFC'
,
s2
]]
[4, 4]
>>>
len
[
normalize
[
'NFD'
,
s1
]],
len
[
normalize
[
'NFD'
,
s2
]]
[5, 5]
>>>
normalize
[
'NFC'
,
s1
]
==
normalize
[
'NFC'
,
s2
]
True
>>>
normalize
[
'NFD'
,
s1
]
==
normalize
[
'NFD'
,
s2
]
True
37, bỏ dấu và thay thế>>>
from
unicodedata
import
normalize
>>>
s1
=
'café'
>>>
s2
=
'cafe
\N{COMBINING ACUTE ACCENT}
'
>>>
len
[
s1
],
len
[
s2
]
[4, 5]
>>>
len
[
normalize
[
'NFC'
,
s1
]],
len
[
normalize
[
'NFC'
,
s2
]]
[4, 4]
>>>
len
[
normalize
[
'NFD'
,
s1
]],
len
[
normalize
[
'NFD'
,
s2
]]
[5, 5]
>>>
normalize
[
'NFC'
,
s1
]
==
normalize
[
'NFC'
,
s2
]
True
>>>
normalize
[
'NFD'
,
s1
]
==
normalize
[
'NFD'
,
s2
]
True
58>>>
from
unicodedata
import
normalize
>>>
s1
=
'café'
>>>
s2
=
'cafe
\N{COMBINING ACUTE ACCENT}
'
>>>
len
[
s1
],
len
[
s2
]
[4, 5]
>>>
len
[
normalize
[
'NFC'
,
s1
]],
len
[
normalize
[
'NFC'
,
s2
]]
[4, 4]
>>>
len
[
normalize
[
'NFD'
,
s1
]],
len
[
normalize
[
'NFD'
,
s2
]]
[5, 5]
>>>
normalize
[
'NFC'
,
s1
]
==
normalize
[
'NFC'
,
s2
]
True
>>>
normalize
[
'NFD'
,
s1
]
==
normalize
[
'NFD'
,
s2
]
True
Cảnh báo
Các ngôn ngữ khác nhau có quy tắc riêng để loại bỏ dấu phụ. Ví dụ, người Đức đổi
59 thành>>>
from
unicodedata
import
normalize
>>>
s1
=
'café'
>>>
s2
=
'cafe
\N{COMBINING ACUTE ACCENT}
'
>>>
len
[
s1
],
len
[
s2
]
[4, 5]
>>>
len
[
normalize
[
'NFC'
,
s1
]],
len
[
normalize
[
'NFC'
,
s2
]]
[4, 4]
>>>
len
[
normalize
[
'NFD'
,
s1
]],
len
[
normalize
[
'NFD'
,
s2
]]
[5, 5]
>>>
normalize
[
'NFC'
,
s1
]
==
normalize
[
'NFC'
,
s2
]
True
>>>
normalize
[
'NFD'
,
s1
]
==
normalize
[
'NFD'
,
s2
]
True
70. Hàm>>>
from
unicodedata
import
normalize
>>>
s1
=
'café'
>>>
s2
=
'cafe
\N{COMBINING ACUTE ACCENT}
'
>>>
len
[
s1
],
len
[
s2
]
[4, 5]
>>>
len
[
normalize
[
'NFC'
,
s1
]],
len
[
normalize
[
'NFC'
,
s2
]]
[4, 4]
>>>
len
[
normalize
[
'NFD'
,
s1
]],
len
[
normalize
[
'NFD'
,
s2
]]
[5, 5]
>>>
normalize
[
'NFC'
,
s1
]
==
normalize
[
'NFC'
,
s2
]
True
>>>
normalize
[
'NFD'
,
s1
]
==
normalize
[
'NFD'
,
s2
]
True
36 của chúng tôi không được tinh chỉnh, vì vậy nó có thể phù hợp hoặc không phù hợp với ngôn ngữ của bạn. Nó hoạt động chấp nhận được đối với tiếng Bồ Đào Nha, mặc dù>>>
from
unicodedata
import
normalize
>>>
s1
=
'café'
>>>
s2
=
'cafe
\N{COMBINING ACUTE ACCENT}
'
>>>
len
[
s1
],
len
[
s2
]
[4, 5]
>>>
len
[
normalize
[
'NFC'
,
s1
]],
len
[
normalize
[
'NFC'
,
s2
]]
[4, 4]
>>>
len
[
normalize
[
'NFD'
,
s1
]],
len
[
normalize
[
'NFD'
,
s2
]]
[5, 5]
>>>
normalize
[
'NFC'
,
s1
]
==
normalize
[
'NFC'
,
s2
]
True
>>>
normalize
[
'NFD'
,
s1
]
==
normalize
[
'NFD'
,
s2
]
True
Tóm lại, các chức năng trong đơn giản hóa. py vượt xa sự chuẩn hóa tiêu chuẩn và thực hiện phẫu thuật sâu trên văn bản, với cơ hội tốt để thay đổi ý nghĩa của nó. Chỉ bạn mới có thể quyết định có đi xa hay không, biết ngôn ngữ mục tiêu, người dùng của bạn và cách sử dụng văn bản đã chuyển đổi