2012-01-19 8 views
8

मैं पाइथन 3 में एक तेज़ और संभावित रूप से सुविधाजनक तरीका ढूंढ रहा हूं, जिसमें केवल असीसी अक्षरों वाले शब्दों के साथ गैर-असीसी अक्षरों के साथ तारों का अनुवाद किया जा सके।ASCII के लिए 7 बिट ASCII में अक्षरों का अनुवाद नहीं करना (जैसे ń से n और ą से 0)

उदाहरण!

żółw => zolw

móżdżek => mozdzek

Łódź => लॉड्ज़

और इतने पर ...

वहाँ राष्ट्रीय वर्णमाला में कई पत्र है कि में बदल सकता है कर रहे हैं ASCII पत्र (जैसे ń से n)। मैं प्रत्येक पत्र का अनुवाद करने के तरीके को निर्दिष्ट करके, अपनी भाषा (पोलिश) के लिए इसे मैन्युअल रूप से कर सकता हूं। लेकिन क्या ऐसा करने का कोई स्वचालित तरीका है? या कुछ लाइब्रेरी जो मुझे चाहिए?

अजगर str.encode() काम नहीं चलेगा, क्योंकि "żółw".encode('ascii', 'replace') == "???w" और "żółw".encode('ascii', 'ignore') == "w" ...

मैं पॉलिश पत्र के लिए इस तरह अनुवाद कर सकते हैं, लेकिन मैं हर दूसरे भाषा के लिए यह करने के लिए नहीं करना चाहती:

>>> utf8_letters = ['ą','ę','ć','ź','ż','ó','ł','ń','ś'] 
>>> ascii_letters = ['a','e','c','z','z','o','l','n','s'] 
>>> trans_dict = dict(zip(utf8_letters,ascii_letters)) 
>>> turtle = "żółw" 
>>> out = [] 
>>> for l in turtle: 
... out.append(trans_dict[l] if l in trans_dict else l) 
>>> result = ''.join(out) 
>>> result 
'zolw' 

उपरोक्त कोड जो मैं पॉलिश अक्षरों के साथ चाहता हूं, लेकिन यह बदसूरत है: < ऐसा करने का सबसे अच्छा तरीका क्या है?

बेशक ऐसे अनुवाद कुछ शब्दों के अर्थों को बदल देंगे, लेकिन यह ठीक है।

+1

ध्यान रखें कि कुछ भाषाओं में, कुछ लोग एक उच्चारण पत्र पर विचार करेंगे जो उस भाषा में एक अलग पत्र माना जाता है। उदाहरण के लिए, स्वीडिश में 'å' अक्षर को आम तौर पर 'ए' से एक अलग अक्षर माना जाता है, न कि केवल 'ए' अक्षर को ऊपर की अंगूठी के साथ। – dreamlax

+0

मुझे इसके बारे में पता है ... मुद्दा यह है कि जब मैं कहीं पॉलिश में लिखता हूं, जहां मेरे राष्ट्रीय पत्र समर्थित नहीं हैं, तो मैं इस "अनुवाद" का उपयोग करता हूं जिसके बारे में मैंने लिखा था। मुझे लगता है कि अन्य देशों के लोगों के पास ऐसे वातावरण में लिखने का अपना तरीका है। मैं जानना चाहता हूं कि इस तरह के परिवर्तन कैसे किए जा सकते हैं। – Maciek

+0

@ जॉन सॉंडर्स, मेरा उत्तर पूरी तरह से अमान्य बनाने के लिए धन्यवाद। –

उत्तर

5

unicodedata मॉड्यूल का उपयोग इस के लिए किया जा सकता है। इसमें यूनिकोड चरित्र नामों का उपयोग करने के लिए कार्य हैं: name और lookup

अब चलो उन्हें करीब देखें।

name('Ż') == 'LATIN CAPITAL LETTER Z WITH DOT ABOVE' 
name('ł') == 'LATIN SMALL LETTER L WITH STROKE' 
lookup('LATIN CAPITAL LETTER Z') == 'Z' 
lookup('LATIN SMALL LETTER L') == 'l' 

एक पैटर्न देखें? के एक समारोह है कि यह इस्तेमाल करते हैं:

import unicodedata 

def normalize_char(c): 
    try: 
     cname = unicodedata.name(c) 
     cname = cname[:cname.index(' WITH')] 
     return unicodedata.lookup(cname) 
    except (ValueError, KeyError): 
     return c 

normalize_char('ę') == 'e' 
normalize_char('Ę') == 'E' 
normalize_char('ś') == 's' 

यह शब्द चरित्र नाम पर के साथ के लिए लग रहा है, सब कुछ है कि यह बाद में चला जाता है और इसे वापस lookup कार्य करने के लिए फ़ीड निकाल देता है।
यदि के साथ कोई नहीं उठाया गया है और जब इस तरह के नाम के साथ कोई चरित्र नहीं है, तो KeyError उठाया गया है, इसलिए फ़ंक्शन चरित्र को अपरिवर्तित करता है।

def normalize(s): 
    return ''.join(normalize_char(c) for c in s) 

normalize('Móżdżek') == 'Mozdzek' 

तो यह समाधान स्पष्ट रूप से बहुत अच्छा है, लेकिन मैं पिछले अभियानों नीचे छोड़ देंगे:

और यहाँ एक समारोह "अनुवाद" कि एक स्ट्रिंग पिछले कार्य के आधार पर है।


unicodedata मॉड्यूल भी एक समारोह है कि इसी तरह के परिणाम – normalize'NFKD' पैरामीटर (अनुकूलता अपघटन) के साथ का वादा किया है, लेकिन यह अधिक से अधिक वर्ण याद करते हैं।


यदि आपके पास चरित्र डेटा है, तो आपके द्वारा प्रदान किया गया कोड बेहतर किया जा सकता है।

letters={'ł':'l', 'ą':'a', 'ń':'n', 'ć':'c', 'ó':'o', 'ę':'e', 'ś':'s', 'ź':'z', 'ż':'z'} 
trans=str.maketrans(letters) 
result=text.translate(trans) 

Here चरित्र डेटा के साथ एक अच्छी तालिका है। यह जावास्क्रिप्ट है लेकिन पाइथन के लिए आसानी से इस्तेमाल किया जा सकता है।


और अगर आप बाहरी लाइब्रेरी का उपयोग करके कोई आपत्ति नहीं है, तो आप Unidecode की कोशिश करना चाहते हो सकता है। यह सिर्फ इसके लिए बनाया गया था।

+0

दुर्भाग्यपूर्ण unicodedata.normalize ('एनएफकेडी', "żółw") == 'żółw' नहीं 'zolw' :( – Maciek

+0

एनएफडी को विघटित करने और फिर सभी संयोजन अंकों को फेंकने के बारे में क्या? –

+0

यह तालिका आपको पसंद है और यह यूनिडकोड लाइब्रेरी काफी आशाजनक है! अभी के लिए मुझे लगता है कि ऐसा करने के लिए कोई बेहतर तरीका नहीं है। – Maciek

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