python convertir - ¿Cuál es la diferencia entre codificar / decodificar?




base64 b64 (7)

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

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

Sé que unicode().encode() convierte los caracteres unicode en una cadena de bytes de acuerdo con un nombre de codificación dado.

Pero no entiendo para qué son str().encode() y unicode().decode() . ¿Alguien puede explicar, y posiblemente también corregir, todo lo demás que me he equivocado anteriormente?

EDITAR:

Varias respuestas dan información sobre lo que .encode hace en una cadena, pero nadie parece saber qué hace .decode para unicode.


Answers

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

Usemos un ejemplo para ilustrar:

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) caracteres chinos cuando se les da un diccionario para buscarlos. La palabra china, en este caso, es el diccionario "utf-8", y no mostraría correctamente la palabra china deseada si examina un diccionario diferente o incorrecto (utilizando un método de decodificación diferente).

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

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

por lo que la información de codificación es los bytes sin procesar, y la información decodificada es los bytes sin procesar y el nombre del diccionario a referenciar (pero no el diccionario en sí).


El método de decode de las cadenas Unicode realmente no tiene ninguna aplicación en absoluto (a menos que tenga algunos datos que no sean de texto en una cadena Unicode por algún motivo, ver más abajo). Es principalmente allí por razones históricas, creo. En Python 3, se ha ido por completo.

unicode().decode() realizará una codificación implícita 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 lo mismo.

Para str().encode() es al revés: intenta una descodificación implícita 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 del último método que es útil: hay encodings que no tienen nada que ver con conjuntos de caracteres, y por lo tanto se pueden aplicar a cadenas de 8 bits de una manera significativa:

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

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



Hay algunas codificaciones que se pueden usar para des / codificar de str a str o de unicode a unicode. Por ejemplo base64, hex 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 se está haciendo una descodificación adecuada entre str y unicode, de todos modos parece un desastre.


anicodo. encode ('encoding') da como resultado un objeto de cadena y puede invocarse en un objeto unicode

una cuerda. La decodificación ('codificación') da como resultado un objeto Unicode y puede invocarse en una cadena, codificada en una codificación determinada.

Algunas explicaciones más:

Puede crear algún objeto Unicode, que no tenga ningún conjunto de codificación. La forma en que está almacenada por Python 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 el que desea imprimir su objeto Unicode a la consola o en algún archivo de texto. Así que tienes que codificarlo (por ejemplo, en UTF-8), llamas a encode ('utf-8') y obtienes una cadena con '\ u <someNumber>' adentro, que es perfectamente imprimible.

Luego, de nuevo, le gustaría hacer lo contrario: leer la cadena codificada en UTF-8 y tratarla como Unicode, por lo que \ u360 sería un carácter, no 5. Luego decodifica una cadena (con codificación seleccionada) y obtener un nuevo objeto del tipo Unicode.

Solo como una nota al margen: puedes seleccionar una codificación pervertida, como 'zip', 'base64', 'rot' y algunos de ellos convertirán de cadena a cadena, pero creo que el caso más común es el que involucra a UTF-8 / UTF-16 y cadena.


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

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

No estoy seguro de qué decodificación es adecuada para un texto Unicode ya decodificado. Al intentarlo con cualquier codificación, parece que siempre intenta codificar primero con la codificación predeterminada del sistema.


Tal vez esto sea obvio, tal vez no, pero puede hacer la cadena '\' llamando a x = chr (92)

x=chr(92)
print type(x), len(x) # <type 'str'> 1
y='\\'
print type(y), len(y) # <type 'str'> 1
x==y   # True
x is y # False




python string unicode character-encoding python-2.x