2012-04-23 15 views
8
>>> a = "我" # chinese 
>>> b = unicode(a,"gb2312") 
>>> a.__class__ 
<type 'str'> 
>>> b.__class__ 
<type 'unicode'> # b is unicode 
>>> a 
'\xce\xd2' 
>>> b 
u'\u6211' 

>>> c = u"我" 
>>> c.__class__ 
<type 'unicode'> # c is unicode 
>>> c 
u'\xce\xd2' 

bc y son todos Unicode, pero >>> b salidas u'\u6211' y >>> c salidas u'\xce\xd2', ¿por qué?Unicode y `decodificación()` en Python

+0

¿Qué terminal está utilizando? No puedo reproducir los resultados en mi Unicode gnome-terminal ('c === u '\ u6211'') –

+0

@ChrisMorgan Probar estos códigos en IDLE. –

+0

también puede reproducir esto con IDLE –

Respuesta

12

Cuando ingresa "我", el intérprete de Python obtiene del terminal una representación de ese carácter en su juego de caracteres local, que almacena en una cadena byte por byte debido al "". En mi sistema UTF-8, eso es . En el tuyo, es '\xce\xd2' porque usas GB2312. Eso explica el valor de su variable a.

Al entrar en u"我", el intérprete de Python no sabe lo que codifica el carácter es en lo que hace es más o menos la misma que para una cadena ordinaria:. Almacena los bytes del carácter de una cadena Unicode, interpretando cada byte como un punto de código Unicode, de ahí el resultado equivocado u'\xce\xd2' (o, en mi caja, u'\xe6\x88\x91').

Este problema solo existe en el intérprete interactivo. Cuando escribe scripts o módulos de Python, puede specify the encoding cerca de la parte superior y las cadenas Unicode saldrán bien. Por ejemplo, en mi sistema, el siguiente imprime la palabra liberté dos veces:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

print(u"liberté") 
print("liberté") 
0

El espectáculo interactivo de Python la representación de un objeto cuando sólo tiene que teclear en su nombre. Por otro lado, el comando de impresión intenta renderizar el personaje. Su variable llamada a es de un tipo de cadena. En realidad, las cadenas en Python 2.x son series de bytes. Por lo tanto, depende de su entorno de trabajo. Usted le dice a la función unicode() que ahora usa la codificación gb2312. Si es verdadero, entonces b contiene la representación correcta del carácter en la codificación dada.

Trate de

>>> print b 

en su caso. Es probable que veas el resultado deseado. Pruebe también:

>>> print repr(a) 
... 
>>> print repr(b) 

La representación es (si es posible) una cadena de texto que cuando copia pegada a un código fuente crearía el objeto con el mismo valor.

Eche un vistazo a Mark Pilgrim "Dive Into Python 3", Capítulo 4. Cadenas (http://getpython3.com/diveintopython3/strings.html) para obtener unas explicaciones agradables y legibles.

Cuestiones relacionadas