2009-01-15 26 views

cevap

7

Bunu aradığınız düşünüyorum:

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

Evet, bu çalışma - gerçekten unicode ayrışmış olduğumu varsayarak. Ne yazık ki sanırım benim metnimde \ u0327 (cedilla'yı birleştirmek) yerine aslında (örneğin) \ u00B8 (cedilla) var. Görünüşe bakılırsa, bu karakterleri birleştirme eşdeğerleriyle eşleştirmeli ya da sadece tamamen şeritlemeliyim. Teşekkürler. – msanders

1

seni gerçekten kesin veremem política Sorunu cevapla çünkü asla denemedim. Ancak standart kütüphanede unicodedata module var. Burada size yardımcı olabilecek decomposition() ve normalize() iki işlevi vardır.

Düzenleme: gerçekten unicode çürümüş olduğundan emin olun. Bazen bir kodlamada doğrudan ifade edilemeyen karakterler yazmak için garip yollar vardır. Bir insan veya bir uzman program tarafından ä olarak zihinsel olarak ayrıştırılması amaçlanan "a gibi.

+0

, aslında doğru çürümüş unicode değil - Rafał Dowgird cevabı üzerine yorumumu bakın. – msanders

5

Ne yazık ki yerine benim metinde \ u0327 (birleştirerek çengelli) arasında aslında (örneğin) \ u00B8 (çengelli) var gibi görünüyor.

eurgh, pis! İşlemi, bir uyumluluk ayrıştırması (NFKD) içerdiğinden, işlem tamamen kayıpsız olmayacak olsa da, yine de otomatik olarak yapabilirsiniz.

Normale U + NFKD için 00B8 ve U + 0327 takiben bir boşluk elde edersiniz. Daha sonra, herhangi bir uzay-takip-birleştiren-karakter karakterini arayan dizgeyi tarayabilir ve alanı kaldırabilirsiniz. Sonunda, birleştiren karakterleri önceki karaktere yerleştirmek için NFC'ye yeniden derleyin. Haklısın

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)