Pergunta

Eu estou tentando entender como python 2,5 lida com strings unicode. Embora até agora eu acho que tenho uma boa noção de como eu deveria lidar com eles em código, eu não compreender totalmente o que está acontecendo nos bastidores, especialmente quando você digita cordas no intérprete rápida.

Assim pitão pré 3.0 tem dois tipos de cordas, a saber: str (cadeias de bytes) e unicode, que são ambos derivados de basestring. O tipo padrão para cordas é str.

objetos str não têm noção de sua codificação real, eles são apenas bytes. Ou você já codificado uma string unicode si mesmo e, portanto, saber qual codificação em que estão, ou você já leu um fluxo de bytes cujo codificação você também sabe de antemão (indeally). Você pode adivinhar a codificação de uma seqüência de byte cuja codificação é desconhecido para você, mas não há apenas uma maneira confiável de descobrir isso. Sua melhor aposta é para decodificar precoce, o uso unicode em todos os lugares em seu código e codificar tarde.

Isso é bom. Mas cordas digitadas no intérprete está realmente codificado para você pelas costas? Desde que o meu entendimento de strings em Python é correto, qual é o método / configuração usa python para tomar esta decisão?

A fonte da minha confusão é os resultados diferentes que eu tenho quando eu tento a mesma coisa sobre a instalação python do meu sistema, e no console python incorporado do meu editor.

 # Editor (Sublime Text)
 >>> s = "La caña de España"
 >>> s
 'La ca\xc3\xb1a de Espa\xc3\xb1a'
 >>> s.decode("utf-8")
 u'La ca\xf1a de Espa\xf1a'
 >>> sys.getdefaultencoding()
 'ascii'

 # Windows python interpreter
 >>> s= "La caña de España"
 >>> s
 'La ca\xa4a de Espa\xa4a'
 >>> s.decode("utf-8")
 Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
   File "C:\Python25\lib\encodings\utf_8.py", line 16, in decode
     return codecs.utf_8_decode(input, errors, True)
 UnicodeDecodeError: 'utf8' codec can't decode byte 0xa4 in position 5: unexpected code byte
 >>> sys.getdefaultencoding()
 'ascii'
Foi útil?

Solução

Deixe-me expandir a resposta de Ignacio: Em ambos os casos, há uma camada extra entre Python e você: em um caso que é Texto Sublime e, no outro, de cmd.exe. A diferença de comportamento que você vê não é devido à Python, mas pelos diferentes codificações usados ??pelo Texto Sublime (utf-8, como parece) e cmd.exe (CP437).

Assim, quando você digita ñ, Sublime Texto envia '\xc3\xb1' para Python, enquanto cmd.exe envia \xa4. [Eu estou simplyfing aqui, omitindo detalhes que não são relevantes para a questão.].

Ainda assim, Python sabe sobre isso. De cmd.exe você provavelmente vai obter algo como:

>>> import sys
>>> sys.stdin.encoding
'cp437'

Considerando que, no Texto Sublime , você terá algo parecido

>>> import sys
>>> sys.stdin.encoding
'utf-8'

Outras dicas

O intérprete usa a codificação nativa seu prompt de comando para a entrada de texto. No seu caso é CP437:

>>> print '\xa4'.decode('cp437')
ñ

Você está ficando confuso porque o editor eo intérprete está usando-se diferentes codificações. O interpretador Python usa o padrão do sistema (neste caso, cp437), enquanto o seu editor usa utf-8.

Note, a diferença desaparece se você especificar uma seqüência de caracteres Unicode, assim:

# Windows python interpreter
>>> s = "La caña de España"
>>> s
'La ca\xa4a de Espa\xa4a'
>>> s = u"La caña de España"
>>> s
u'La ca\xf1a de Espa\xf1a'

A moral da história? Codificações são complicados. Tenha certeza que você sabe o que codificar os seus arquivos de origem estão em, ou jogar pelo seguro, usando sempre a versão escapou de caracteres especiais.

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