Pregunta

Nunca he estado seguro de entender la diferencia entre decodificar y codificar str/unicode.

Yo sé eso str().decode() es para cuando tienes una cadena de bytes que sabes que tiene una determinada codificación de caracteres, dado ese nombre de codificación devolverá una cadena Unicode.

Yo sé eso unicode().encode() convierte caracteres Unicode en una cadena de bytes según un nombre de codificación determinado.

Pero no entiendo qué str().encode() y unicode().decode() son para.¿Alguien puede explicar y posiblemente también corregir cualquier otra cosa en la que me haya equivocado anteriormente?

EDITAR:

Varias respuestas dan información sobre lo que .encode hace con una cuerda, pero nadie parece saber qué .decode lo hace para Unicode.

¿Fue útil?

Solución

El decode El método de cadenas Unicode realmente no tiene ninguna aplicación (a menos que tenga algunos datos que no sean texto en una cadena Unicode por algún motivo; consulte a continuación).Creo que está allí principalmente por razones históricas.En Python 3 desapareció por completo.

unicode().decode() realizará una implícita codificación de s utilizando el códec predeterminado (ASCII).Verifique esto así:

>>> s = u'ö'
>>> s.decode()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf6' in position 0:
ordinal not in range(128)

>>> s.encode('ascii')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf6' in position 0:
ordinal not in range(128)

Los mensajes de error son exactamente los mismos.

Para str().encode() es al revés: intenta una implícita descodificación de s con la codificación predeterminada:

>>> s = 'ö'
>>> s.decode('utf-8')
u'\xf6'
>>> s.encode()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0:
ordinal not in range(128)

Usado así, str().encode() también es superfluo.

Pero Hay otra aplicación de este último método que es útil:hay codificaciones que no tienen nada que ver con los juegos de caracteres y, por lo tanto, se pueden aplicar a cadenas de 8 bits de manera significativa:

>>> s.encode('zip')
'x\x9c;\xbc\r\x00\x02>\x01z'

Aunque tienes razón:el uso ambiguo de "codificación" para ambas aplicaciones es...incómodo.De nuevo, con separado byte y string tipos en Python 3, esto ya no es un problema.

Otros consejos

Representar una cadena Unicode como una cadena de bytes se conoce como codificación . Use u'...'.encode(encoding).

Ejemplo:

    >>> u'æøå'.encode('utf8')
    '\xc3\x83\xc2\xa6\xc3\x83\xc2\xb8\xc3\x83\xc2\xa5'
    >>> u'æøå'.encode('latin1')
    '\xc3\xa6\xc3\xb8\xc3\xa5'
    >>> u'æøå'.encode('ascii')
    UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-5: 
    ordinal not in range(128)

Por lo general, codifica una cadena Unicode cada vez que necesita usarla para IO, por ejemplo, transferirla a través de la red o guardarla en un archivo de disco.

Para convertir una cadena de bytes en una cadena unicode se conoce como decodificación . Utilice unicode('...', encoding) o '...'. Decodificación (codificación).

Ejemplo:

   >>> u'æøå'
   u'\xc3\xa6\xc3\xb8\xc3\xa5' # the interpreter prints the unicode object like so
   >>> unicode('\xc3\xa6\xc3\xb8\xc3\xa5', 'latin1')
   u'\xc3\xa6\xc3\xb8\xc3\xa5'
   >>> '\xc3\xa6\xc3\xb8\xc3\xa5'.decode('latin1')
   u'\xc3\xa6\xc3\xb8\xc3\xa5'

Normalmente decodifica una cadena de bytes cada vez que recibe datos de cadena de la red o de un archivo de disco.

Creo que hay algunos cambios en el manejo de Unicode en Python 3, por lo que lo anterior probablemente no sea correcto para Python 3.

Algunos buenos enlaces:

anUnicode. codificar ('codificación') da como resultado un objeto string y se puede invocar en un objeto unicode

aString. decode ('codificación') da como resultado un objeto unicode y se puede invocar en una cadena, codificada en una codificación dada.


Algunas explicaciones más:

Puede crear algún objeto unicode, que no tiene ningún conjunto de codificación. La forma en que Python lo almacena en la memoria no es de su incumbencia. Puede buscarlo, dividirlo y llamar a cualquier función de manipulación de cadenas que desee.

Pero llega un momento en que desea imprimir su objeto Unicode en la consola o en algún archivo de texto. Por lo tanto, debe codificarlo (por ejemplo, en UTF-8), llama a encode ('utf-8') y obtiene una cadena con '\ u & Lt; someNumber gt; ' dentro, que es perfectamente imprimible.

Luego, nuevamente, le gustaría hacer lo contrario: lea la cadena codificada en UTF-8 y trátela como Unicode, de modo que el \ u360 sería un carácter, no 5. Luego, decodificará una cadena (con codificación seleccionada) y obtenga un nuevo objeto del tipo Unicode.

Solo como una nota al margen: puede seleccionar alguna codificación pervertida, como 'zip', 'base64', 'rot' y algunas de ellas se convertirán de cadena en cadena, pero creo que el caso más común es uno que involucra UTF-8 / UTF-16 y cadena.

mybytestring.encode (somecodec) es significativo para estos valores de somecodec:

  • base64
  • bz2
  • zlib
  • hexadecimal
  • quopri
  • rot13
  • string_escape
  • uu

No estoy seguro de para qué sirve decodificar un texto unicode ya decodificado. Intentar eso con cualquier codificación parece intentar siempre codificar primero con la codificación predeterminada del sistema.

Debería leer Python UnicodeDecodeError - Estoy malinterpretando la codificación . Mi comprensión de Unicode en Python fue mucho más clara después de leer la respuesta aceptada.

Hay algunas codificaciones que pueden usarse para descodificar / codificar de str a str o de unicode a unicode. Por ejemplo base64, hexadecimal o incluso rot13. Se enumeran en el módulo de códecs .

Editar:

El mensaje de decodificación en una cadena Unicode puede deshacer la operación de codificación correspondiente:

In [1]: u'0a'.decode('hex')
Out[1]: '\n'

El tipo devuelto es str en lugar de unicode, lo cual es desafortunado en mi opinión. Pero cuando no está haciendo una decodificación / decodificación adecuada entre str y unicode, esto parece un desastre de todos modos.

La respuesta simple es que son exactamente opuestos entre sí.

la computadora usa la unidad básica de byte para almacenar y procesar información, no tiene sentido para los ojos humanos.

por ejemplo, '\ xe4 \ xb8 \ xad \ xe6 \ x96 \ x87' es la representación de dos caracteres chinos, pero la computadora solo sabe (es decir, imprimir o almacenar) que son caracteres chinos cuando se les da un diccionario para busque esa palabra china, en este caso, es " utf-8 " diccionario, y no podría mostrar correctamente la palabra china prevista si busca en un diccionario diferente o incorrecto (utilizando un método de decodificación diferente).

En el caso anterior, el proceso para que una computadora busque palabras chinas es la decodificación ().

Y el proceso de escritura de la computadora en chino en la memoria de la computadora es codificar ().

entonces la información de codificación son los bytes sin procesar, y la información decodificada es los bytes sin procesar y el nombre del diccionario a referencia (pero no el diccionario en sí).

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