python - imagen - ¿Cuál es la diferencia entre codificar/decodificar?
python base64 decoder (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.
Debería leer Python UnicodeDecodeError - ¿Estoy mal entendiendo la codificación ? Mi comprensión de Unicode en Python fue mucho más clara después de leer la respuesta aceptada.
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.
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í).
Para 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.
Convertir una cadena de bytes en una cadena Unicode se conoce como decodificación . Use unicode(''...'', encoding)
o ''...''. Decode (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:
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.