Tôi chỉ tìm thấy câu trả lời này trên Web:
import unicodedata
def remove_accents(input_str):
nfkd_form = unicodedata.normalize('NFKD', input_str)
only_ascii = nfkd_form.encode('ASCII', 'ignore')
return only_ascii
Nó hoạt động tốt (ví dụ như tiếng Pháp), nhưng tôi nghĩ rằng bước thứ hai (loại bỏ dấu) có thể được xử lý tốt hơn so với việc bỏ các ký tự không phải ASCII, vì điều này sẽ thất bại đối với một số ngôn ngữ (ví dụ tiếng Hy Lạp). Giải pháp tốt nhất có lẽ là loại bỏ rõ ràng các ký tự unicode được gắn thẻ là dấu phụ.
Chỉnh sửa : đây là mẹo:
import unicodedata
def remove_accents(input_str):
nfkd_form = unicodedata.normalize('NFKD', input_str)
return u"".join([c for c in nfkd_form if not unicodedata.combining(c)])
unicodedata.combining(c)
sẽ trả về true nếu ký tự c
có thể được kết hợp với ký tự trước, điều đó chủ yếu là nếu đó là dấu phụ.
Chỉnh sửa 2 : remove_accents
mong đợi một chuỗi unicode , không phải là một chuỗi byte. Nếu bạn có một chuỗi byte, thì bạn phải giải mã nó thành một chuỗi unicode như thế này:
encoding = "utf-8" # or iso-8859-15, or cp1252, or whatever encoding you use
byte_string = b"café" # or simply "café" before python 3.
unicode_string = byte_string.decode(encoding)