online - python base64 to file




¿Cuál es la diferencia entre codificar/decodificar? (5)

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.



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.


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:


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.







python-2.x