Странная проблема с кодировкой ввода в IPython

Я запускаю python 2.6 с последним IPython в Windows XP SP3, и у меня есть два вопроса. Первая из моих проблем заключается в том, что когда в 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]:

Вторая проблема менее расстраивает, но все же. Когда я пытаюсь открыть файл и задаю аргумент имени файла как строку, отличную от юникода, он не открывается. Я должен принудительно декодировать строку из OEM-набора символов, прежде чем открывать файлы, что довольно неудобно:

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

Может быть, у меня есть что-то с моими региональными настройками, я не знаю, потому что я не могу даже нарезать кириллический текст с консоли. Я поставил "русский" везде в региональных настройках, но, похоже, он не работает.

Ответы

Ответ 1

Да. Ввод Unicode на консоли всегда проблематичен и обычно лучше всего избегать, но IPython особенно сломан. Он преобразует символы, которые вы вводите на консоль, как если бы они были закодированы в ISO-8859-1, независимо от фактической кодировки, которую вы даете.

Теперь вам нужно сказать u'm:/\u0411\u043b\u043e\u043a\u043d\u043e\u0442/home.tdl'.

Ответ 2

Как ни странно, это сработает:

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

Или:

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

Это обходит ошибку ipython, введя строку как сырую кодированную байтовую строку UTF-8. ipython не пытается с ним смешного бизнеса. Затем вы можете закодировать его в строку юникода, если хотите, и продолжить свою жизнь.

Ответ 3

У меня была такая же проблема с греческим входом, этот патч с панели запуска работает и для меня.

Спасибо.