在IPython中input编码奇怪的问题

我正在Windows XP SP3上运行Python 2.6和最新的IPython,我有两个问题。 我的第一个问题是,在IPython下,我无法直接inputUnicodestring,因此无法打开非拉丁文名称的文件。 让我来certificate一下。 在通常的python下工作:

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

顺便说一句,这里是西里尔字母。 在IPython下,我得到:

 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]: 

第二个问题不那么令人沮丧,但仍然。 当我尝试打开一个文件,并指定文件名参数为非unicodestring时,它不会打开。 我必须强行解码来自OEM字符集的string,然后才能打开文件,这很不方便:

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

也许这与我的区域设置有关,我不知道,因为我甚至无法从控制台上剪贴西里尔字母文本。 我在地区设置了任何地方的“俄罗斯”,但似乎并不奏效。

是。 在控制台输入Unicode总是有问题,通常最好避免,但是IPython尤其突破 。 它转换在控制台上键入的字符,就像它们在ISO-8859-1中编码一样,而不管你给的是什么编码。

现在,你将不得不说u'm:/\u0411\u043b\u043e\u043a\u043d\u043e\u0442/home.tdl'

反过来说,这将工作:

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

要么:

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

这通过输入字符串作为UTF-8编码的原始字节串来解决ipython的bug。 ipython不会尝试任何有趣的业务。 如果你愿意的话,你可以自由地把它编码成unicode字符串,并且继续你的生活。

我也遇到了与希腊文输入相同的问题, 启动板中的这个补丁也适用于我。

谢谢。