Por qué declarar unicode por cadena en python?

Todavía estoy aprendiendo python y tengo una duda:

En python 2.6.x I generalmente declarar la codificación en el archivo de encabezado como este (como en PEP 0263)

# -*- coding: utf-8 -*-

Después de eso, mis cadenas se escriben como de costumbre:

a = "A normal string without declared Unicode"

Pero cada vez que veo un proyecto de python de código, la codificación no es declarada en la cabecera. En su lugar, se declara en cada cadena como esta:

a = u"A string with declared Unicode"

¿Cuál es la diferencia? ¿Cuál es el propósito de esto? Sé Python 2.6.x establece la codificación ASCII de forma predeterminada, pero puede ser anulada por el encabezado de la declaración, ¿cuál es el punto de por cadena de declaración?

Anexo: Parece que he mezclado codificación de archivo con codificación de cadena. Gracias por explicarlo 🙂

  • # coding: utf8 es lo suficientemente bueno, no hay necesidad de -*-
  • Supongo que significaba para el tipo de # coding: utf-8.
  • Debe ser #coding=utf-8. python.org/dev/peps/pep-0263

5 Kommentare

  1. 164

    Esas son dos cosas diferentes, como otros han mencionado.

    Cuando se especifica # -*- coding: utf-8 -*-, estás diciendo Python el archivo de código fuente que has guardado es utf-8. El valor predeterminado para Python 2 es el ASCII (para Python 3 es utf-8). Esto sólo afecta a cómo el intérprete lee los caracteres en el archivo.

    En general, probablemente no sea la mejor idea para incrustar alta caracteres unicode en su archivo no importa lo que la codificación es; se puede utilizar la cadena de unicode se escapa, que el trabajo en cualquiera de codificación.


    Cuando se declara una cadena con un u frente a, como u'This is a string', se dice que el compilador de Python que es la cadena Unicode, no en bytes. Esto se realiza principalmente de forma transparente por el intérprete; la diferencia más obvia es que ahora puede incrustar caracteres unicode en la cadena (es decir, u'\u2665' es ahora legal). Usted puede utilizar from __future__ import unicode_literals para que sea el predeterminado.

    Esto sólo se aplica a Python 2; en Python 3 el valor predeterminado es Unicode, y necesita especificar un b en la parte delantera (como b'These are bytes', para declarar una secuencia de bytes).

    • Gracias por la explicación! Me voy a fijar esta aceptada, ya que es la más completa de uno 🙂
    • La codificación fuente por defecto de Python 2 es ascii.
    • En realidad es una gran idea para incrustar alta caracteres unicode en su archivo. Dudo que los que no hablan inglés quiere leer unicode se escapa en sus cadenas.
    • Gracias por el ASCII de corrección; rápidamente me desnatada en el PEP (python.org/dev/peps/pep-0263) y se habla de Latin-1 en el preámbulo. No creo que es una gran idea para incrustar alta caracteres unicode en el archivo de la mayoría de los casos. Sin duda, si vas a la codificación de un montón de no-inglés cadenas en el archivo de origen puede hacer que sea más fácil, pero por lo general hacen que para mostrar al usuario, y probablemente debería definir en un lugar separado de todos modos. Y un solo mal configurado editor de texto, puede dañar todos esos personajes.
    • convenido, si la programación de un i18nalized app, pero tenga en cuenta si usted es un Chino o francés programador. No sólo las cuerdas, pero los comentarios así. Es genial el Python es flexible con codificaciones de fuente. En Python 3, incluso puede tener caracteres no ASCII en los nombres de variable.
    • pero, ¿por qué es la sintaxis tan extraño?

  2. 23

    Como otros han dicho, # coding: especifica la codificación de la fuente se guarda el archivo. Aquí están algunos ejemplos para ilustrar esto:

    Un archivo guardado en el disco como cp437 (mi consola de codificación), pero sin ningún tipo de codificación declarado

    b = 'über'
    u = u'über'
    print b,repr(b)
    print u,repr(u)

    De salida:

      File "C:\ex.py", line 1
    SyntaxError: Non-ASCII character '\x81' in file C:\ex.py on line 1, but no
    encoding declared; see http://www.python.org/peps/pep-0263.html for details

    De salida de archivo con la # coding: cp437 añadido:

    über '\x81ber'
    über u'\xfcber'

    Al principio, Python no sabía de la codificación, y se quejó de los caracteres no-ASCII. Una vez que se supo de la codificación, la cadena de bytes consiguió los bytes que estaban realmente en el disco. Para la cadena Unicode, Python leer \x81, sabía que en cp437 que era un ü, y se decodifica en el punto de código Unicode para ü que es U+00 FC. Cuando la cadena de bytes que se imprimió, Python, envía el valor hexadecimal 81 a la consola directamente. Cuando la cadena Unicode fue impreso, Python detecta correctamente mi consola de codificación como cp437 y traducido Unicode ü a la cp437 valor para ü.

    Esto es lo que sucede con un archivo declarado y se guarda en el formato UTF-8:

    ├╝ber '\xc3\xbcber'
    über u'\xfcber'

    En UTF-8, ü es codificado como los bytes hexadecimales C3 BC, por lo que la cadena de bytes que contiene los bytes, pero la cadena Unicode es idéntica a la del primer ejemplo. Python leer los dos bytes y decodificado correctamente. Python imprime la cadena de bytes mal, porque se envió a los dos bytes UTF-8 que representa ü directamente a mi cp437 de la consola.

    Aquí el archivo se declara cp437, sino que guardó en UTF-8:

    ├╝ber '\xc3\xbcber'
    ├╝ber u'\u251c\u255dber'

    La cadena de bytes que todavía tiene los bytes en el disco (UTF-8 bytes hexadecimales C3 BC), pero los interpreta como dos cp437 caracteres en lugar de una sola codificados en UTF-8 caracteres. Esos dos personajes, donde traducido a puntos de código Unicode, y todo lo que se imprime incorrectamente.

  3. 10

    Que no establece el formato de la cadena; se establece el formato del archivo. Incluso con ese encabezado, "hello" es una cadena de bytes, no es una cadena Unicode. Para hacerla Unicode, vas a tener que usar u"hello" en todas partes. El encabezado es sólo un toque de qué formato utilizar cuando la lectura de la .py archivo.

    • Me equivoqué entonces, pensé que eran la misma. Por lo que el uso de cadenas unicode es i18n?
    • Sí, para la mayor parte. Si estuviera haciendo un sitio web con Django o algo, y ese algo tenía que manejar a la gente con caracteres no-ASCII, entonces ese es otro posible uso.
  4. 7

    El encabezado de la definición es la de definir la codificación del código en sí, no la resultante de las cadenas en tiempo de ejecución.

    poner un carácter no ascii como ۲ en la secuencia de comandos de python sin el utf-8 en el encabezado de la definición de lanzar una advertencia

    Por qué declarar unicode por cadena en python?

  5. -1

    Me hizo la siguiente módulo llamado unicoder a ser capaz de hacer la transformación de las variables:

    import sys
    import os
    
    def ustr(string):
    
        string = 'u"%s"'%string
    
        with open('_unicoder.py', 'w') as script:
    
            script.write('# -*- coding: utf-8 -*-\n')
            script.write('_ustr = %s'%string)
    
        import _unicoder
        value = _unicoder._ustr
    
        del _unicoder
        del sys.modules['_unicoder']
    
        os.system('del _unicoder.py')
        os.system('del _unicoder.pyc')
    
        return value

    A continuación, en el programa se podría hacer lo siguiente:

    # -*- coding: utf-8 -*-
    
    from unicoder import ustr
    
    txt = 'Hello, Unicode World'
    txt = ustr(txt)
    
    print type(txt) # <type 'unicode'>

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea