Pregunta

Estoy tratando de entender cómo python 2.5 ofertas con cadenas unicode.Aunque por ahora creo que tengo una buena idea de cómo voy a manejar en el código, no entiendo lo que está pasando detrás de las escenas, especialmente cuando el tipo de cadenas en el intérprete de comandos.

Así python pre 3.0 tiene dos tipos de cadenas de caracteres, a saber: str (cadenas de bytes) y unicode, que se derivan de basestring.El tipo predeterminado para las cadenas es str.

str los objetos no tienen noción de su codificación real, sólo son bytes.Ya sea que usted ha codificado una cadena unicode a sí mismo y, por tanto, saber en qué codificación que están, o han leído un flujo de bytes cuya codificación usted también sabe de antemano (indeally).Se puede adivinar la codificación de una cadena de bytes cuya codificación es desconocido para ti, pero simplemente no hay una manera confiable de calcular esto.Su mejor apuesta es para decodificar temprana, el uso de unicode en todas partes en el código y codificación de la tarde.

Que está bien.Pero las cadenas escrito en el intérprete de hecho son codificados por detrás de su espalda?Siempre que mi comprensión de las cadenas en Python es correcta, ¿cuál es el método de configuración/python utiliza para tomar esta decisión?

La fuente de mi confusión es la diferencia de resultados que obtengo cuando me tratan de lo mismo en mi sistema la instalación de python, y en mi editor integrado de la consola de python.

 # 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'
¿Fue útil?

Solución

Permítanme ampliar la respuesta de Ignacio: En ambos casos hay una capa adicional entre Python y que: en un caso es Sublime Text y en el otro es cmd.exe. La diferencia en el comportamiento que se ve no se debe a Python, sino por las diferentes codificaciones utilizadas por Sublime Text (UTF-8, como parece) y cmd.exe (cp437).

Por lo tanto, cuando se escribe ñ, Sublime Text envía '\xc3\xb1' a Python, mientras que cmd.exe envía \xa4. [Estoy aquí simplyfing, omitiendo detalles que no son relevantes para la pregunta.].

Sin embargo, Python sabe de eso. De cmd.exe probablemente obtendrá algo como:

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

mientras que dentro de Sublime Text que obtendrá algo como

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

Otros consejos

El intérprete utiliza la codificación nativa del símbolo del sistema de introducción de texto. En su caso se trata de CP437:

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

Te estás confundido porque el editor y el intérprete están utilizando diferentes codificaciones mismos. El intérprete de Python utiliza su defecto del sistema (en este caso, cp437), mientras que el editor utiliza utf-8.

Tenga en cuenta, la diferencia desaparece si se especifica una cadena Unicode, así:

# 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'

La moraleja de la historia? Codificaciones son difíciles. Asegúrese de saber qué codificación archivos de origen están en, o jugar a lo seguro, use siempre la versión escapado de caracteres especiales.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top