2012-01-15 10 views
6

Considere el siguiente ejemplo:de codificación utilizado para u "" literales

>>> s = u"баба" 
>>> s 
u'\xe1\xe0\xe1\xe0' 
>>> print s 
áàáà 

estoy usando cp1251 codificación dentro de la inactividad, pero parece que el intérprete utiliza realmente para crear latin1 cadena Unicode:

>>> print s.encode('latin1') 
баба 

¿Por qué? ¿Hay especificaciones para tal comportamiento?

CPython, 2.7.


Editar

El código realidad estaba buscando es

>>> u'\xe1\xe0\xe1\xe0' == u'\u00e1\u00e0\u00e1\u00e0' 
True 

Parece que cuando codificación Unicode con latin1 códec, todos los puntos Unicode menos que 256 se dejan simplemente como es, pues, dando como resultado bytes que escribí antes.

+3

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

+3

¿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 –

+0

@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? –

Respuesta

8

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 sunicode.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' 
+0

gracias, me sacaste del camino correcto. –

Cuestiones relacionadas