2009-01-15 14 views
5

Sử dụng Python 2.5, tôi có một số văn bản trong lưu trữ trong một đối tượng unicode:Làm cách nào để đảo ngược phân tách Unicode bằng Python?

Dinis e Isabel, uma difı'cil relac¸a~o vợ chồng e polı'tica

này xuất hiện là decomposed Unicode. Có một cách chung chung bằng Python để đảo ngược quá trình phân hủy, vì vậy tôi kết thúc với:

Dinis e Isabel, uma difícil relação vợ chồng e política

Trả lời

7

Tôi nghĩ rằng bạn đang tìm kiếm này:

>>> import unicodedata  
>>> print unicodedata.normalize("NFC",u"c\u0327") 
ç 
+1

Có, điều này hoạt động - giả sử tôi thực sự có unicode bị phân hủy. Thật không may có vẻ như tôi thực sự có (ví dụ) \ u00B8 (cedilla) thay vì \ u0327 (kết hợp cedilla) trong văn bản của tôi. Có vẻ như tôi sẽ cần phải lập bản đồ các ký tự này cho kết hợp tương đương của chúng hoặc chỉ xóa chúng hoàn toàn. Cảm ơn. – msanders

1

tôi có thể không thực sự cung cấp cho bạn một dứt khoát trả lời cho câu hỏi của bạn bởi vì tôi chưa bao giờ thử điều đó. Nhưng có một unicodedata module trong thư viện chuẩn. Nó có hai chức năng decomposition()normalize() có thể giúp bạn ở đây.

Chỉnh sửa: Đảm bảo rằng nó thực sự là mã unicode bị phân tách. Đôi khi có những cách kỳ lạ để viết các ký tự không thể được biểu diễn trực tiếp trong mã hóa. Giống như "a có nghĩa là được phân tích về mặt tinh thần bởi một chương trình chuyên môn của con người hoặc một số chương trình như ä.

+0

Bạn nói đúng, nó không thực sự là một mã unicode bị phân tách thích hợp - hãy xem nhận xét của tôi về câu trả lời của Rafał Dowgird. – msanders

5

Đáng tiếc là có vẻ như tôi thực sự có (ví dụ) \ u00B8 (dấu móc dưới) thay vì \ u0327 (kết hợp dấu móc dưới) trong văn bản của tôi.

Eurgh, khó chịu! Bạn vẫn có thể làm điều đó tự động, mặc dù quá trình này sẽ không hoàn toàn mất mát vì nó liên quan đến phân tích khả năng tương thích (NFKD).

Chuẩn hóa U + 00B8 thành NFKD và bạn sẽ nhận được một khoảng trắng theo sau là U + 0327. Sau đó, bạn có thể quét qua chuỗi tìm kiếm bất kỳ trường hợp nào của ký tự dấu cách theo sau, và loại bỏ khoảng trắng. Cuối cùng, chuyển sang NFC để đặt các ký tự kết hợp vào ký tự trước đó.

s= unicodedata.normalize('NFKD', s) 
s= ''.join(c for i, c in enumerate(s) if c!=' ' or unicodedata.combining(s[i+1])==0) 
s= unicodedata.normalize('NFC', s) 
Các vấn đề liên quan