2009-01-15 7 views
5

अजगर 2.5 का उपयोग करना, मैं एक यूनिकोड वस्तु में संग्रहीत में कुछ पाठ है:मैं पायथन का उपयोग कर यूनिकोड अपघटन को कैसे उलट सकता हूं?

Dinis ई इसाबेल, उमा relac¸a~o difı'cil वैवाहिक ई polı'tica

यह प्रतीत होता है decomposed Unicode होने के लिए। वहाँ पायथन में एक सामान्य तरीके अपघटन उल्टा करने के लिए है, इसलिए मैं के साथ अंत:

Dinis ई इसाबेल, उमा difícil relação वैवाहिक ई política

उत्तर

7

मुझे लगता है कि आप इस के लिए देख रहे हैं:

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

हां, यह काम करता है - मान लीजिए कि मैंने वास्तव में यूनिकोड को विघटित किया है। दुर्भाग्यवश ऐसा लगता है कि मेरे पाठ में \ u0327 (cedilla संयोजन) के बजाय वास्तव में \ u00B8 (cedilla) है (उदाहरण के लिए)। ऐसा लगता है कि मुझे इन वर्णों को उनके संयोजन के बराबर मैप करने की आवश्यकता होगी या बस उन्हें पूरी तरह से पट्टी करनी होगी। धन्यवाद। – msanders

1

मैं वास्तव में आप एक निश्चित दे सकते हैं आपके प्रश्न का उत्तर क्योंकि मैंने कभी कोशिश नहीं की। लेकिन मानक पुस्तकालय में unicodedata module है। इसमें दो कार्य decomposition() और normalize() हैं जो आपकी सहायता कर सकते हैं।

संपादित करें: सुनिश्चित करें कि यह वास्तव में विकृत यूनिकोड है। कभी-कभी ऐसे अक्षर लिखने के अजीब तरीके हैं जिन्हें सीधे एन्कोडिंग में व्यक्त नहीं किया जा सकता है। "a की तरह जो मानव या कुछ विशेष कार्यक्रम द्वारा ä के रूप में मानसिक रूप से विश्लेषण किया गया है।

+0

आप सही हैं, यह वास्तव में उचित विघटित यूनिकोड नहीं है - राफल डॉउगर्ड के उत्तर पर मेरी टिप्पणी देखें। – msanders

5

दुर्भाग्य से ऐसा लगता है मैं वास्तव में (उदाहरण के लिए) \ u00B8 (सेडिला) है अपने पाठ में \ u0327 (संयोजन सेडिला) के बजाय।

Eurgh, बुरा! आप अभी भी इसे स्वचालित रूप से कर सकते हैं, हालांकि प्रक्रिया पूरी तरह से हानि रहित नहीं होगी क्योंकि इसमें एक संगतता अपघटन (एनएफकेडी) शामिल है।

मानक के अनुसार U + NFKD को 00B8 और आप एक अंतरिक्ष U + 0327 के बाद मिल जाएगा। फिर आप स्ट्रिंग के माध्यम से स्पेस-बाद-संयोजन-चरित्र के किसी भी मामले की तलाश कर सकते हैं, और स्थान को हटा सकते हैं। अंत में संयोजन चरित्र को पिछले चरित्र पर रखने के लिए एनएफसी को पुनः संयोजित करें।

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) 
संबंधित मुद्दे

 संबंधित मुद्दे