我在Windows XP SP3上使用最新的IPython运行python 2.6,我有两个问题。我的第一个问题是,在IPython下,我无法直接输入Unicode字符串,因此无法打开具有非拉丁名称的文件。让我来证明一下。在通常的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]:
第二个问题不那么令人沮丧,但仍然如此。当我尝试打开文件,并将文件名参数指定为非unicode字符串时,它不会打开。在打开文件之前,我必须强制解码来自OEM字符集的字符串,这非常不方便:
>>> fd2 = open('m:/Блокнот/home.tdl'.decode('cp866'))
>>>
也许它与我的区域设置有关,我不知道,因为我甚至无法从控制台剪切和粘贴西里尔文本。我在区域环境中把“俄语”放在任何地方,但似乎没有用。
答案 0 :(得分:12)
是。在控制台上键入Unicode总是有问题的,通常最好避免,但是IPython is particularly broke。它会将您在其控制台上键入的字符转换为ISO-8859-1中编码的字符,而不管您提供的实际编码。
目前,您必须说u'm:/\u0411\u043b\u043e\u043a\u043d\u043e\u0442/home.tdl'
。
答案 1 :(得分:1)
反之,这将起作用:
fd = open('m:/Блокнот/home.tdl')
或者:
fd = open('m:/Блокнот/home.tdl'.encode('utf-8'))
通过将字符串作为原始UTF-8编码的字节串输入来解决ipython的错误。 ipython不会尝试任何有趣的业务。然后,如果愿意,您可以自由地将其编码为unicode字符串,并继续您的生活。
答案 2 :(得分:0)
我对希腊语输入也有同样的问题,这个patch from launchpad也适用于我。
感谢。