Pergunta

Estou executando o Python 2.6 com o mais recente ipython no Windows XP SP3 e tenho duas perguntas. Primeiro, um dos meus problemas é que, quando no iPython, não posso inserir diretamente as strings Unicode e, como resultado, não pode abrir arquivos com nomes não latinos. Deixe -me demonstrar. Sob Python usual, isso funciona:

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

É cirílico lá, a propósito. E sob o ipython que recebo:

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

O segundo problema é menos frustrante, mas ainda assim. Quando tento abrir um arquivo e especificar o argumento do nome do arquivo como string não unicode, ele não abre. Eu tenho que à força Decode string do OEM Charset, antes que eu pudesse abrir arquivos, o que é bastante inconveniente:

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

Talvez tenha algo para minhas configurações regionais, eu não sei, porque nem consigo cortar e colar o texto cirílico do console. Eu coloquei "russo" em todos os lugares em ambientes regionais, mas isso parece não funcionar.

Foi útil?

Solução

Sim. Digitar Unicode no console é sempre problemático e geralmente é melhor evitado, mas Ipython está particularmente quebrado. Ele converte caracteres que você digita em seu console como se fossem codificados no ISO-8859-1, independentemente da codificação real que você está dando.

Por enquanto, você terá que dizer u'm:/\u0411\u043b\u043e\u043a\u043d\u043e\u0442/home.tdl'.

Outras dicas

Perversamente, isso funcionará:

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

Ou:

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

Isso contorna o bug do ipython, inserindo a string como um string de byte codificado UTF-8 bruto. Ipython não tenta nenhum negócio engraçado com ele. Você então você está livre para codificá -lo em uma string unicode, se quiser, e continue com sua vida.

Eu tive o mesmo problema com a entrada grega, este Patch do Launchpad funciona para mim também.

Obrigado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top