मेरे पास एक पंक्ति/शब्द प्रत्येक पंक्ति है जिसमें मैंने एसटीडीआईएन से पर्ल को पढ़ा है। मेरे पास स्टॉपवर्ड की एक सूची है (जैसे "á", "साओ", "é") और मैं प्रत्येक शब्द के साथ उनमें से प्रत्येक की तुलना करना चाहता हूं, और अगर वे बराबर हैं तो हटा दें। समस्या यह है कि मैं फ़ाइल के एन्कोडिंग प्रारूप के बारे में निश्चित नहीं हूं।पर्ल - फ़ाइल एन्कोडिंग और शब्द तुलना
मैं file
आदेश से मिलता है:
words.txt: Non-ISO extended-ASCII English text
मेरे linux टर्मिनल UTF-8 में है और यह कुछ शब्दों के लिए सही सामग्री से पता चलता है और दूसरों को नहीं करने के लिए। उनमें से कुछ से उत्पादन होता है:
condi<E3>
conte<FA>dos
ajuda, mas não resolve
mo<E7>ambique
pedagógico são fenómenos
आप देख सकते हैं कि 3 और 5 वीं लाइनों को सही ढंग से उच्चारण और विशेष वर्णों के साथ शब्दों की पहचान कर रहे हैं, जबकि दूसरों को नहीं। अन्य लाइनों के लिए सही आउटपुट होना चाहिए: condiã, conteúdos और moçambique।
यदि मैं binmode(STDOUT, utf8)
का उपयोग करता हूं तो "गलत" रेखाएं अब सही तरीके से आउटपुट करती हैं जबकि अन्य लोग नहीं करते हैं। उदाहरण के लिए 3 पंक्ति:
ajuda, मास nà £ o संकल्प
क्या मैं लोगों को क्या करना चाहिए?
@michael धन्यवाद अब इसे सही ढंग से outputting है;) मैंने महसूस किया कि फ़ाइल के बहुमत ISO-8859-1 में है और utf-8 में कुछ भागों (यही कारण है कि उनमें से कुछ सही ढंग से outputting गया है) एक और चीज़। मुझे 'lc' फ़ंक्शन का उपयोग करना होगा क्योंकि मेरे स्टॉपवर्ड सभी कम-से-कम हैं, और वाक्यांशों में utf-8 नहीं होने पर मुझे समस्याएं आ रही हैं। इस परिस्थितियों में यदि मेरे पास एक उच्चारण के साथ एक ऊपरी केस पत्र है तो यह कम cased नहीं होगा। – Barata
@ बाराटा: यदि आप 'uc' आदि पर काम करना चाहते हैं तो आपको अभी भी गैर-यूटीएफ 8 तारों को डीकोड करना होगा। पर्ल 5.12 (और ऊपर) 'यूनिकोड_स्ट्रिंग्स सुविधा भी मदद कर सकती है, जिसमें यह बाइट स्ट्रिंग के लिए आईएसओ 885 9 -1 मान लेगा। तुलना करें: 'perl -e' प्रिंट uc ("\ xB5 \ xE9 \ xDF") ''=> ' μéß', ** जो गलत है, ** 'perl -M5.012 -e' प्रिंट uc ("\ xB5 \ xE9 \ xDF") ''=>' ΜÉSS' ** जो सही है। ** अंतिम स्ट्रिंग वास्तव में '" \ x {39C} \ x {C9} SS "' या '" \ N { ग्रीक कैपिटल लिटर एमयू} \ N {लेटिन कैपिटल लिटर ई ACUTE} एसएस "'। मूल स्ट्रिंग '\ N {माइक्रो साइन} \ N {लेटिन छोटे अक्षर ई के साथ} \ N {लैटिन लघु पत्र SHARP एस}" 'है। – tchrist
@tchrist माइकल कोड का उपयोग करके, 'if $ @' की जांच करना और स्ट्रिंग को आईएसओ -885 9 -1 में डीकोड करना पर्याप्त है? – Barata