2011-08-04 14 views
14

मैं एक फ़ाइल में कुछ स्ट्रिंग लिखने की कोशिश कर रहा हूं (स्ट्रिंग्स को HTML पार्सर सुंदर सूप द्वारा मुझे दिया गया है)।यूनिकोड एन्कोडर फ़ाइल को लिखते समय

मैं उन्हें प्रदर्शित करने के लिए "प्रिंट" का उपयोग कर सकते, लेकिन जब मैं file.write() मैं निम्नलिखित त्रुटि मिलती है का उपयोग करें:

UnicodeEncodeError: 'ascii' codec can't encode character u'\xa3' in position 6: ordinal not in range(128) 

मैं यह कैसे पार्स कर सकते हैं?

उत्तर

11

यह त्रुटि तब होती है जब आप एक यूनिकोड स्ट्रिंग को गैर-अंग्रेज़ी वर्ण (128 से परे यूनिकोड वर्ण) को पास करते हैं जो किसी ASCII बाइटस्ट्रिंग की अपेक्षा करता है। पाइथन बाइटस्ट्रिंग के लिए डिफ़ॉल्ट एन्कोडिंग ASCII है, "जो वास्तव में 128 (अंग्रेज़ी) वर्णों को संभालती है"। यही कारण है कि 128 से परे यूनिकोड वर्णों को कनवर्ट करने का प्रयास त्रुटि उत्पन्न करता है।

यूनिकोड()

unicode(string[, encoding, errors]) 

निर्माता हस्ताक्षर यूनिकोड (स्ट्रिंग [, एन्कोडिंग, त्रुटियों]) है। इसके सभी तर्क 8-बिट तार होना चाहिए।

पहला तर्क निर्दिष्ट एन्कोडिंग का उपयोग कर यूनिकोड में परिवर्तित किया गया है; अगर आप एन्कोडिंग तर्क को बंद रखना होगा, ASCII एन्कोडिंग, रूपांतरण के लिए प्रयोग किया जाता है तो 127 से अधिक पात्रों त्रुटियों

उदाहरण के लिए माना जाएगा

s = u'La Pe\xf1a' 
print s.encode('latin-1') 

या

write(s.encode('latin-1')) 

लैटिन -1

+0

स्ट्रिंग यह outputting है "£ 123" – Rory

+0

जो मान्य ASCII नहीं है की तरह एक कीमत है। पाउंड साइन 127 कोड की ASCII रेंज के बाहर चार कोड 163 है। –

+0

आपको उन एन्कोडिंग को निर्दिष्ट करना होगा जो उन अक्षरों को एन्कोड कर सकते हैं। फ़ाइलों में वर्ण नहीं हैं; वे बाइट्स होते हैं। एन्कोडिंग वर्णों को बाइट्स में परिवर्तित करें। –

17

का उपयोग करके एन्कोड करेगा हाँ, लगभग 99.9% ओ एफ अनुभवी पायथन उपयोगकर्ताओं ने इसे पहले देखा है।

यदि मैं Google में 'पायथन यूनिकोड' टाइप करता हूं, तो मुझे लगभग 14 मिलियन परिणाम मिलते हैं; पहला http://docs.python.org/howto/unicode.html आधिकारिक दस्तावेज़ है जो पूरी स्थिति को विस्तार से विस्तार से बताता है; और चौथा http://farmdev.com/talks/unicode/ है जो एक अधिक व्यावहारिक अवलोकन है जो आपको बहुत अधिक चम्मच-फ़ीड देगा, और यह भी सुनिश्चित करेगा कि आप क्या समझ रहे हैं।

आपको वास्तव में इन प्रकार के अवलोकनों को पढ़ने और समझने की आवश्यकता है, हालांकि वे लगते हैं। वास्तव में कोई भी इसके आसपास नहीं हो रहा है। पाठ कठिन है। "सादे पाठ" जैसी कोई चीज नहीं है, वर्षों से उचित प्रतिकृति नहीं रही है, और वहां वास्तव में कभी नहीं था, हालांकि हमने दशकों का नाटक किया था। लेकिन यूनिकोड कम से कम एक मानक है।

आपको http://www.joelonsoftware.com/articles/Unicode.html भी पढ़ना चाहिए।

+0

लिंक के लिए धन्यवाद! बहुत उपयोगी – tatlar

4

आपके प्रश्न का उत्तर "कोडेक्स का उपयोग करें" है। एपडेड कोड कुछ गेटटेक्स्ट जादू, एफडब्ल्यूआईडब्ल्यू भी दिखाता है। http://wiki.wxpython.org/Internationalization

import codecs 

import gettext 

localedir = './locale' 
langid = wx.LANGUAGE_DEFAULT # use OS default; or use LANGUAGE_JAPANESE, etc. 
domain = "MyApp"    
mylocale = wx.Locale(langid) 
mylocale.AddCatalogLookupPathPrefix(localedir) 
mylocale.AddCatalog(domain) 

translater = gettext.translation(domain, localedir, 
           [mylocale.GetCanonicalName()], fallback = True) 
translater.install(unicode = True) 

# translater.install() installs the gettext _() translater function into our namespace... 

msg = _("A message that gettext will translate, probably putting Unicode in here") 

# use codecs.open() to convert Unicode strings to UTF8 

Logfile = codecs.open(logfile_name, 'w', encoding='utf-8') 

Logfile.write(msg + '\n') 

गूगल इस समस्या पर हिट से भरा होने के बावजूद, मैं इसे नहीं बल्कि कठिन (यह वास्तव में यूनिकोड के बारे में अजगर डॉक्स में है, बल्कि burried) इस सरल समाधान खोजने के लिए मिल गया।

तो ... एचटीएच ...

गज

+0

"सरल"? यह i18n मशीनरी का एक गुच्छा भी दिखा रहा है जिसे ओपी की परवाह नहीं है - वह यह सुनिश्चित करने की कोशिश नहीं कर रहा है कि लोग सही भाषा में टेक्स्ट देखें, वह एक विशिष्ट स्रोत से एक विशिष्ट भाषा में पाठ को पकड़ने की कोशिश कर रहा है और इसे एक फाइल में रखता है । तो आपके स्निप का एकमात्र प्रासंगिक हिस्सा पहली पंक्ति और आखिरी दो है, वास्तव में। "मुश्किल खोजने के लिए" के रूप में, वास्तव में? आपने Google के लिए क्या किया? मैंने 'यूनिकोड एन्कोड त्रुटि: 'ascii' कोडेक चरित्र को एन्कोड नहीं कर सकता; परिणाम पर्याप्त उपयोगी लगते हैं ... –

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