De acuerdo a la documentación, la integrada de la cadena de codificación string_escape:

Producir[s] una cadena que es adecuado como un literal de cadena en el código fuente de Python

…mientras que la unicode_escape:

Producir[s] una cadena que es adecuado como Unicode literal en el código fuente de Python

Ellos deben tener aproximadamente el mismo comportamiento. PERO, parece que el tratamiento de las comillas simples de manera diferente:

>>> print """before '" \0 after""".encode('string-escape')
before \'" \x00 after
>>> print """before '" \0 after""".encode('unicode-escape')
before '" \x00 after

La string_escape escapa de la comilla simple, mientras que el Unicode no. Es seguro asumir que simplemente puedo:

>>> escaped = my_string.encode('unicode-escape').replace("'", "\\'")

…y obtener el comportamiento esperado?

Edición: Sólo para ser súper claro, el comportamiento esperado es conseguir algo adecuado como un literal.

InformationsquelleAutor Mike Boers | 2010-06-03

2 Comentarios

  1. 22

    Según mi interpretación de la aplicación de unicode-escape y el unicode repr en el CPython 2.6.5 fuente, sí; la única diferencia entre repr(unicode_string) y unicode_string.encode('unicode-escape') es la inclusión de ajuste de las cotizaciones y escapar de lo que la cita fue utilizado.

    Ambos son impulsados por la misma función, unicodeescape_string. Esta función toma un parámetro cuya única función es la de alternar la adición de la envoltura de las cotizaciones y escapar de esa cita.

    • Esta ha sido la respuesta más clara a algunos unicode error unsupported Unicode escape sequence incluso funciona en el 2016! Gracias!
  2. 12

    Dentro del rango 0 ≤ c < 128, sí, el ' es la única diferencia de CPython 2.6.

    >>> set(unichr(c).encode('unicode_escape') for c in range(128)) - set(chr(c).encode('string_escape') for c in range(128))
    set(["'"])

    Fuera de este rango los dos tipos no son intercambiables.

    >>> '\x80'.encode('string_escape')
    '\\x80'
    >>> '\x80'.encode('unicode_escape')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    UnicodeDecodeError: 'ascii' codec cant decode byte 0x80 in position 0: ordinal not in range(128)
    
    >>> u'1'.encode('unicode_escape')
    '1'
    >>> u'1'.encode('string_escape')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: escape_encode() argument 1 must be str, not unicode

    En Python 3.x, el string_escape de codificación ya no existe, ya str sólo puede almacenar Unicode.

    • Que es sólo porque ‘\x80’ no es válido codificada en ascii de la cadena. Trate de u'\x80'.encode('unicode-escape') y obtener '\\x80'
    • Pero es su my_string un str o un unicode?
    • el error es muy explícito: UnicodeDecodeError: ‘ascii’ codec no puede decodificar byte 0x80 en la posición 0: ordinal no en el rango de(128) es decir que el resultado de la ord función, es decir: ord('\x80') devuelve 128 y range(128)[-1] es de 127, de modo 128 no está allí.

Dejar respuesta

Please enter your comment!
Please enter your name here