Cuando escribe un carácter como б
en el terminal, verá un б
, pero lo que realmente se ingresa es una secuencia de bytes.
Debido a que su codificación terminal es cp1251
, escribiendo баба
resultados en la secuencia de bytes igual al Unicode баба
codificado en cp1251
:
In [219]: "баба".decode('utf-8').encode('cp1251')
Out[219]: '\xe1\xe0\xe1\xe0'
(Tenga en cuenta que utilizo utf-8
anterior porque mi terminal de codificación es utf-8
, no cp1251
. Para mí, "баба".decode('utf-8')
es solo unicode para баба
.)
Dado que tipear баба
resulta en la secuencia de byte s \xe1\xe0\xe1\xe0
, cuando escribe u"баба"
en la terminal, Python recibe u'\xe1\xe0\xe1\xe0'
en su lugar. Es por eso que está viendo
>>> s
u'\xe1\xe0\xe1\xe0'
Esto sucede Unicode para representar áàáà
.
Y cuando se escribe
>>> print s.encode('latin1')
la codificación latin1
convierte u'\xe1\xe0\xe1\xe0'
-'\xe1\xe0\xe1\xe0'
. El terminal recibe la secuencia de bytes '\xe1\xe0\xe1\xe0'
, y los decodifica con cp1251
, imprimiendo de este modo баба
:
In [222]: print('\xe1\xe0\xe1\xe0'.decode('cp1251'))
баба
Probar:
>>> s = "баба"
(sin el u
) en su lugar. O,
>>> s = "баба".decode('cp1251')
hacer s
unicode
.O bien, utilizar el prolijo pero muy explícita (y terminales que codifica agnóstico):
>>> s = u'\N{CYRILLIC SMALL LETTER BE}\N{CYRILLIC SMALL LETTER A}\N{CYRILLIC SMALL LETTER BE}\N{CYRILLIC SMALL LETTER A}'
o la corta pero menos fácilmente comprensible
>>> s = u'\u0431\u0430\u0431\u0430'
usted está haciendo la pregunta equivocada. La pregunta no es "qué codificación se usa para los literales de cadena Unicode" (una pregunta sin sentido, las codificaciones son cosas de entrada/salida, la representación interna es obviamente algo que puede representar Unicode y eso es todo lo que necesita saber). La pregunta a la que realmente quieres saber la respuesta es "¿por qué IDLE está estropeando mis codificaciones de texto, y está sucediendo a la entrada o a la salida, y cómo logro que haga lo que quiero?" – kindall
¿Cómo está definiendo su codificación? vea http://www.python.org/dev/peps/pep-0263/ para definir la codificación en su archivo fuente. Por favor, da tu versión de Python también. Según http://docs.python.org/howto/unicode.html la codificación predeterminada utilizada será ASCII. Las versiones de Python anteriores a 2.4 estaban centradas en el euro y suponían Latin-1 como codificación predeterminada para los literales de cadena –
@kindall, bueno, afaik, necesitamos tener codificación al crear un objeto unicode (ya que no necesitamos bytes, sino caracteres significativos) . Entonces, ¿por qué el intérprete no usa mi codificación real para realizar bytes-> caracteres trans? –