Domanda

Io corro Python 2.6 con l'ultimo IPython su Windows XP SP3, e ho due domande. In primo luogo uno dei miei problemi è, quando sotto IPython, non posso stringhe Unicode di ingresso direttamente, e, di conseguenza, i file non possono aprire con i nomi non latini. Lasciatemi mostrare. Sotto al solito python questo funziona:

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

E 'cirillico in là, tra l'altro. E sotto l'IPython ottengo:

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

Il secondo problema è meno frustrante, ma ancora. Quando provo ad aprire un file, e specificare il nome del file argomento come stringa non Unicode, non si apre. Devo forzatamente stringa di decodifica da OEM charset, prima che potessi aprire i file, che è piuttosto scomodo:

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

Forse ha qualcosa a che con le mie impostazioni internazionali, non so, perché non riesco nemmeno a tagliare e incollare il testo cirillico da console. Ho messo "russo" in tutto il mondo nelle impostazioni internazionali, ma non sembra funzionare.

È stato utile?

Soluzione

Sì. Digitando Unicode alla console è sempre problematico e generalmente meglio evitare, ma IPython è particolarmente rotto . Converte caratteri digitati sulla sua console come se fossero codificati in ISO-8859-1, indipendentemente dalla codifica reale si sta dando.

Per il momento, dovrete dire u'm:/\u0411\u043b\u043e\u043a\u043d\u043e\u0442/home.tdl'.

Altri suggerimenti

abbastanza perverso, questo funzionerà:

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

o

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

Questo aggira bug di ipython inserendo la stringa come un grezzo codifica UTF-8 byte-stringa. ipython non cerca qualsiasi attività divertente con esso. Sei quindi libero di codificarlo in una stringa unicode, se volete, e andare avanti con la tua vita.

Ho avuto lo stesso problema con l'ingresso della Grecia, questo patch dal launchpad lavora per anche me.

Grazie.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top