इस यूनिकोड डेटाबेस के लिए पायथन का "सर्वश्रेष्ठ ASCII" कहां है?


85

मेरे पास कुछ पाठ हैं जो यूनिकोड विराम चिह्न का उपयोग करते हैं, जैसे बाएं डबल उद्धरण, एपोस्ट्रोफ के लिए सही एकल उद्धरण, और इसी तरह, और मुझे एएससीआईआई में इसकी आवश्यकता है। क्या पायथन के पास स्पष्ट ASCII के विकल्प के साथ इन पात्रों का एक डेटाबेस है, इसलिए मैं उन सभी को "" में बदलने से बेहतर कर सकता हूं? ?


21
आप वीर योद्धा हैं। यूनिकोड अजगर का कट्टर-नेमसिस है।
डेविड बर्जर

2
जो लोग यह पाते हैं, वे इस बात में दिलचस्पी ले सकते हैं कि पायथन यूनिकोड स्ट्रिंग में लहजे को हटाने का सबसे अच्छा तरीका क्या है?
मार्टिन थोमा

जवाबों:


89

Unidecode एक पूर्ण समाधान की तरह दिखता है। यह फैंसी उद्धरणों को आस्की उद्धरणों में परिवर्तित करता है, लैटिन वर्णों को अस्वीकार्य करता है और यहां तक ​​कि लिप्यंतरण का प्रयास उन पात्रों से भी करता है जिनके पास ASCII समकक्ष नहीं हैं। इस तरह से आपके उपयोगकर्ताओं को एक गुच्छा नहीं देखना है? जब आपको 7-बिट एसेसी सिस्टम के माध्यम से उनके पाठ को पास करना था।

>>> from unidecode import unidecode
>>> print unidecode(u"\u5317\u4EB0")
Bei Jing 

http://www.tablix.org/~avian/blog/archives/2009/01/unicode_transliteration_in_python/


3
हम्म .. जर्मन umlauts उदाहरण के लिए ö = oe, ä = ae, आदि के बजाय उनके आधार चरित्र में बदल जाते हैं
ThiefMaster

4
@ThiefMaster उन समकक्ष सभी भाषाओं में सच हैं? हो सकता है कि यूनिडबॉस सबसे कम आम भाजक के लिए जा रहा हो।
मार्क रैनसम

Unidecode सबसे निश्चित रूप से भाषा-स्वतंत्र समाधान के लिए जाता है। जर्मन-केंद्रित समाधान के लिए, s/ö/oe/बाकी के साथ सफाई करने से पहले मैन्युअल रूप से ( जैसे, आदि) लागू करें unidecode
एलेक्सिस

4
वास्तव में, उदाहरण के लिए, फिनिश में, जबकि ä -> a, ö -> oयह गलत है, यह अभी भी बेहतर है aeऔरoe
एंटिटी हवाला

25

अपने मूल उत्तर में, मैंने भी सुझाव दिया unicodedata.normalize। हालाँकि, मैंने इसका परीक्षण करने का निर्णय लिया और यह पता चला कि यह यूनिकोड उद्धरण चिह्नों के साथ काम नहीं करता है। यह यूनिकोड वर्णों के उच्चारण का अच्छा काम करता है, इसलिए मुझे लगता है कि unicodedata.normalizeयह unicode.decompositionफ़ंक्शन का उपयोग करके कार्यान्वित किया गया है, जो मुझे विश्वास दिलाता है कि यह शायद केवल यूनिकोड वर्णों को संभाल सकता है जो एक पत्र और एक विशिष्ट चिह्न के संयोजन हैं, लेकिन मैं वास्तव में नहीं हूं यूनिकोड विनिर्देश पर एक विशेषज्ञ, इसलिए मैं सिर्फ गर्म हवा से भरा हो सकता है ...

किसी भी घटना में, आप unicode.translateइसके बजाय विराम चिह्न वर्णों से निपटने के लिए उपयोग कर सकते हैं । translateविधि यूनिकोड ऑर्डिनल्स यूनिकोड ऑर्डिनल्स का एक शब्दकोश लेता है, इस प्रकार आप एक मानचित्रण कि ASCII-संगत विराम चिह्न के लिए यूनिकोड-केवल विराम चिह्न तब्दील बना सकते हैं:

'Maps left and right single and double quotation marks'
'into ASCII single and double quotation marks'
>>> punctuation = { 0x2018:0x27, 0x2019:0x27, 0x201C:0x22, 0x201D:0x22 }
>>> teststring = u'\u201Chello, world!\u201D'
>>> teststring.translate(punctuation).encode('ascii', 'ignore')
'"hello, world!"'

यदि आवश्यक हो तो आप अधिक विराम चिह्न जोड़ सकते हैं, लेकिन मुझे नहीं लगता कि आपको हर एक यूनिकोड पंचर चरित्र को संभालने के बारे में चिंता करने की आवश्यकता है। यदि आप करते हैं संभाल लहजे और अन्य विशेषक के निशान की जरूरत है, तो आप अभी भी उपयोग कर सकते हैं unicodedata.normalizeउन अक्षरों से निपटने के लिए।



हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.