2009-07-28 18 views
5

Giả sử tôi có chuỗi "blöt träbåt" có một số ao với âm sắc và đổ chuông ở trên. Tôi muốn nó trở thành "blot trabat" đơn giản nhất có thể. Tôi đã thực hiện một số đào và tìm thấy các phương pháp sau đây: (. \u0308 cho umlauts)Cách tốt nhất để thay thế các ký tự quốc tế bằng các đối tác Latin gốc bằng Python là gì?

import unicodedata 
unicode_string = unicodedata.normalize('NFKD', unicode(string)) 

này sẽ cung cấp cho tôi những chuỗi ở định dạng unicode với các nhân vật quốc tế chia thành thư cơ sở và kết hợp nhân vật Bây giờ để lấy lại này vào một chuỗi ASCII tôi có thể làm ascii_string = unicode_string.encode('ASCII', 'ignore') và nó sẽ chỉ bỏ qua các ký tự kết hợp, dẫn đến chuỗi "blot trabat".

Câu hỏi đặt ra ở đây là: có cách nào tốt hơn để thực hiện việc này không? Nó cảm thấy như một đường vòng, và tôi đã nghĩ rằng có thể có một cái gì đó tôi không biết về. Tất nhiên tôi có thể gói nó lên trong một hàm trợ giúp, nhưng tôi muốn kiểm tra xem điều này có tồn tại trong Python không.

+0

"Chuỗi ASCII" blöt träbåt "" là một mâu thuẫn. ASCII không có ký tự có dấu. Ý bạn là "Chuỗi Unicode"? – MSalters

+0

Hey, đó chính xác là điều tôi đang làm trong C# ... –

+0

Vâng tôi vừa mới nhận ra mình đã sử dụng sai thuật ngữ. Nó không nhất thiết phải là Unicode. Nó có thể được mở rộng ASCII (đó là những gì tôi thực sự có ý nghĩa.) – Blixt

Trả lời

7

Sẽ tốt hơn nếu bạn tạo một bảng rõ ràng và sau đó sử dụng phương thức unicode.translate. Lợi thế là chuyển ngữ chính xác hơn, ví dụ: chuyển ngữ "ö" thành "oe" và "ß" thành "ss", nên được thực hiện bằng tiếng Đức.

Có một số gói chuyển ngữ trên PyPI: translitcodec, Unidecodetrans.

+1

Bạn nói đúng, phiên âm tốt hơn là chỉ xóa đồ trang trí khỏi các ký tự. Nếu '" große "' trở thành "grose", điều đó sẽ gây nhầm lẫn (không phải là tôi nghĩ rằng tôi sẽ đối phó với các từ tiếng Đức, nhưng vẫn) ... – Blixt

+0

Tôi sử dụng * translitcodec * vì nó có vẻ là nhất mô-đun cấu trúc chuyên nghiệp. Nó cũng không giống như * trans *, thay thế 'å' bằng' aa' và 'ä' bằng' ae' là thích hợp khi dịch chuyển. – Blixt

+0

@Blixt: xin lỗi, tôi không thể trợ giúp với đề xuất về gói cụ thể - đây có thể là câu hỏi SO riêng biệt. Tuy nhiên, có vẻ như bạn đã thực hiện một đánh giá rồi. –

Các vấn đề liên quan