2010-02-14 14 views
13

में इनपुट एन्कोडिंग के साथ अजीब समस्या मैं विंडोज एक्सपी एसपी 3 पर नवीनतम आईपीथन के साथ पायथन 2.6 चला रहा हूं, और मेरे पास दो प्रश्न हैं। मेरी पहली समस्या यह है कि, जब आईपीथॉन के तहत, मैं यूनिकोड स्ट्रिंग को सीधे इनपुट नहीं कर सकता, और नतीजतन, गैर-लैटिन नामों वाली फ़ाइलों को नहीं खोल सकता। मुझे प्रदर्शन करने दो। सामान्य पायथन के तहत यह काम करता है:आईपीथॉन

>>> sys.getdefaultencoding() 
'ascii' 
>>> sys.getfilesystemencoding() 
'mbcs' 
>>> fd = open(u'm:/Блокнот/home.tdl') 
>>> print u'm:/Блокнот/home.tdl' 
m:/Блокнот/home.tdl 
>>> 

यह रास्ते में साइरिलिक है। और आईपीथॉन के तहत मुझे मिलता है:

In [49]: sys.getdefaultencoding() 
Out[49]: 'ascii' 

In [50]: sys.getfilesystemencoding() 
Out[50]: 'mbcs' 

In [52]: fd = open(u'm:/Блокнот/home.tdl') 
--------------------------------------------------------------------------- 
IOError         Traceback (most recent call last) 

C:\Documents and Settings\andrey\<ipython console> in <module>() 

IOError: [Errno 2] No such file or directory: u'm:/\x81\xab\xae\xaa\xad\xae\xe2/home.tdl' 

In [53]: print u'm:/Блокнот/home.tdl' 
-------------->print(u'm:/Блокнот/home.tdl') 
ERROR: An unexpected error occurred while tokenizing input 
The following traceback may be corrupted or invalid 
The error message is: ('EOF in multi-line statement', (15, 0)) 

--------------------------------------------------------------------------- 
UnicodeEncodeError      Traceback (most recent call last) 

C:\Documents and Settings\andrey\<ipython console> in <module>() 

C:\Program Files\Python26\lib\encodings\cp866.pyc in encode(self, input, errors) 
    10 
    11  def encode(self,input,errors='strict'): 
---> 12   return codecs.charmap_encode(input,errors,encoding_map) 
    13 
    14  def decode(self,input,errors='strict'): 

UnicodeEncodeError: 'charmap' codec can't encode characters in position 3-9: character maps to <und 

In [54]: 

दूसरी समस्या कम निराशाजनक है, लेकिन फिर भी। जब मैं कोई फ़ाइल खोलने का प्रयास करता हूं, और गैर-यूनिकोड स्ट्रिंग के रूप में फ़ाइल नाम तर्क निर्दिष्ट करता हूं, तो यह नहीं खुलता है। मैं जबरन OEM चारसेट से डिकोड स्ट्रिंग के लिए है इससे पहले कि मैं फ़ाइलों को खोलने सकता है, जो बहुत असुविधाजनक है,:,

>>> fd2 = open('m:/Блокнот/home.tdl'.decode('cp866')) 
>>> 

शायद यह मेरी क्षेत्रीय सेटिंग्स के साथ करने के लिए कुछ न कुछ है, मैं नहीं जानता कि मैं क्योंकि यह कर सकते हैं ' कंसोल से सिरिलिक टेक्स्ट काट और पेस्ट भी नहीं। मैंने क्षेत्रीय सेटिंग्स में हर जगह "रूसी" रखा है, लेकिन ऐसा लगता है कि यह काम नहीं कर रहा है।

उत्तर

12

हां। कंसोल पर यूनिकोड टाइपिंग हमेशा समस्याग्रस्त है और आमतौर पर सबसे अच्छी तरह से बचाया जाता है, लेकिन IPython is particularly broke। यह आपके कंसोल पर टाइप किए गए अक्षरों को परिवर्तित करता है जैसे कि वे वास्तविक एन्कोडिंग के बावजूद, आईएसओ -885 9 -1 में एन्कोड किए गए थे।

अभी के लिए, आपको u'm:/\u0411\u043b\u043e\u043a\u043d\u043e\u0442/home.tdl' कहना होगा।

+0

ओह, ठीक है। हालांकि, यह दुखद है। ठीक करने के लिए इंतजार करेंगे। –

+3

यहां इस समस्या के लिए पैच है https://bugs.launchpad.net/ipython/+bug/339642 आईपीआईबीटीएन वितरण से iplib.py से लाइन 'स्रोत = स्रोत.नकोड (self.stdin_encoding)' को हटाएं। यह ओएस एक्स में मेरे लिए काम किया। –

+0

@ t0ster: टिप के लिए धन्यवाद, मेरे लिए काम किया। और सोचने के लिए मैंने सोचने में कई घंटे बिताए हैं कि यह Matplotlib का मुद्दा है। – Halka

0

मुझे ग्रीक इनपुट के साथ एक ही समस्या थी, यह patch from launchpad मेरे लिए भी काम करता है।

धन्यवाद।

1

Perversely पर्याप्त, इस काम करेगा:

fd = open('m:/Блокнот/home.tdl') 

या:

fd = open('m:/Блокнот/home.tdl'.encode('utf-8')) 

यह IPython के बग के आसपास हो जाता है एक कच्चे UTF-8 एन्कोडेड बाइट-स्ट्रिंग के रूप में स्ट्रिंग inputting द्वारा। ipython इसके साथ किसी भी मजाकिया व्यापार की कोशिश नहीं करता है। यदि आप चाहें तो इसे एक यूनिकोड स्ट्रिंग में एन्कोड करने के लिए स्वतंत्र हो जाते हैं, और अपने जीवन के साथ आगे बढ़ते हैं।