Qual é a diferença entre codificar / decodificar?

votos
156

Eu nunca estive certo que eu entender a diferença entre str decodificação / unicode e codificar.

Eu sei que str().decode()é para quando você tem uma seqüência de bytes que você sabe que tem uma certa codificação de caracteres, uma vez que o nome de codificação ele irá retornar uma seqüência de caracteres Unicode.

Eu sei que unicode().encode()converte caracteres Unicode em uma seqüência de bytes de acordo com um determinado nome de codificação.

Mas eu não entendo o que str().encode()e unicode().decode()são para. Alguém pode explicar, e possivelmente também corrigir qualquer outra coisa que eu comecei errado acima?

EDITAR:

Várias respostas dar informações sobre o que .encodefaz em uma corda, mas ninguém parece saber o que .decodefaz para unicode.

Publicado 15/01/2009 em 16:13
fonte usuário
Em outras línguas...                            


7 respostas

votos
93

O decodemétodo de strings unicode realmente não tem quaisquer aplicações em tudo (a menos que você tem alguns dados não-texto em uma string unicode, por algum motivo - veja abaixo). É principalmente lá por razões históricas, eu acho. Em Python 3 é completamente desaparecido.

unicode().decode()executará um implícito codificação de susando o codec (ASCII) padrão. Verificar isso assim:

>>> 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)

As mensagens de erro são exatamente os mesmos.

Por str().encode()que é o contrário - ele tenta um implícito decodificação de scom a codificação padrão:

>>> 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 como este, str().encode()também é supérfluo.

Mas há uma outra aplicação do último método que é útil: há codificações que não têm nada a ver com conjuntos de caracteres e, portanto, pode ser aplicada às cordas de 8 bits de uma forma significativa:

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

Você está certo, porém: o uso ambíguo de "encoding" para ambas estas aplicações é ... awkard. Novamente, com separado bytee stringtipos em Python 3, isso não é mais um problema.

Respondeu 16/01/2009 em 03:06
fonte usuário

votos
59

Para representar uma cadeia Unicode como uma sequência de bytes é conhecido como codificação . Use u'...'.encode(encoding).

Exemplo:

    >>> u'æøå'.encode ( 'UTF-8')
    '\ 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: codec 'ascii' não pode codificar caracteres na posição 0-5: 
    não ordinal na gama (128)

Você normalmente codificar uma seqüência de caracteres Unicode sempre que precisar usá-lo para IO, por exemplo transferi-lo através da rede, ou guardá-lo para um arquivo de disco.

Para converter uma seqüência de bytes para uma cadeia unicode é conhecido como decodificação . Use unicode('...', encoding)ou '...'. Decodificar (codificação).

Exemplo:

   >>> u'æøå'
   u '\ xc3 \ xa6 \ xc3 \ XB8 \ xc3 \ xa5' # intérprete imprime o objeto unicode como assim
   >>> 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'

Você normalmente decodificar uma seqüência de bytes sempre que você receber dados de cadeia a partir da rede ou a partir de um arquivo em disco.

Eu acredito que há algumas mudanças no manuseio unicode em python 3, de modo que o acima provavelmente não é correta para python 3.

Alguns bons links:

Respondeu 15/01/2009 em 21:41
fonte usuário

votos
12

mybytestring.encode (somecodec) é significativa para estes valores de somecodec:

  • base64
  • bz2
  • zlib
  • feitiço
  • quopri
  • rot13
  • string_escape
  • uu

Eu não sei o que decodificação de um texto unicode já decodificado é bom para. Tentar que com qualquer codificação parece sempre tentar codificar com a codificação padrão do sistema em primeiro lugar.

Respondeu 15/01/2009 em 17:15
fonte usuário

votos
11

anUnicode. codificar ( 'codificação') resulta numa cadeia de objecto e pode ser chamado de um objecto de Unicode

uma linha. descodificar ( 'codificação') resulta numa Unicode objecto e pode ser chamado em uma corda, codificado em determinada codificação.


Alguns mais explicações:

Você pode criar algum objeto unicode, que não tem qualquer conjunto de codificação. A forma como ele é armazenado pelo Python na memória não é da sua preocupação. Você pode procurá-la, dividi-lo e chamar qualquer função de cadeia manipulando você gosta.

Mas chega um momento, quando você gostaria de imprimir seu objeto unicode para consolar ou em algum arquivo de texto. Então você tem que codificar -lo (por exemplo - em UTF-8), você chama encode ( 'utf-8') e você terá uma string com '\ u <someNumber>' no interior, o que é perfeitamente impressão.

Então, mais uma vez - que você gostaria de fazer o oposto - corda ler codificados em UTF-8 e tratá-lo como um Unicode, assim que o \ U360 seria um personagem, não 5. Então você decodificar uma string (com codificação selecionado) e obter novo objeto do tipo unicode.

Assim como uma nota lateral - você pode selecionar alguns codificação pervertido, como 'zip', 'base64', 'rot' e alguns deles vão converter de corda para corda, mas acredito que o caso mais comum é aquele que envolve UTF-8 / UTF-16 e string.

Respondeu 17/01/2009 em 00:11
fonte usuário

votos
8

Você deve ler Python UnicodeDecodeError - Estou entendendo mal codificar . O meu entendimento de unicode em Python foi muito mais clara depois de ler a resposta aceita.

Respondeu 16/01/2009 em 09:47
fonte usuário

votos
5

Existem algumas codificações que podem ser usados para de- / codificação de str para str ou de Unicode para Unicode. Por exemplo base64, hex ou mesmo rot13. Eles estão listados no módulo de codecs .

Editar:

A mensagem de descodificação numa cadeia Unicode pode desfazer a operação de codificação correspondente:

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

O tipo de retorno é str em vez de unicode que é lamentável, na minha opinião. Mas quando você não está fazendo uma adequada en- / decodificação entre str e unicode esta parece ser uma confusão de qualquer maneira.

Respondeu 15/01/2009 em 16:20
fonte usuário

votos
0

A resposta simples é que eles são exatamente o oposto um do outro.

Vamos usar um exemplo para ilustrar:

o computador usa a unidade muito básico de byte para armazenar e processar informação, não tem sentido para os olhos humanos.

por exemplo, '\ XE4 \ XB8 \ xad \ XE6 \ x96 \ x87' é a representação de dois caracteres chineses, mas o computador só sabe (ou seja, impressão ou loja) é caracteres chineses quando eles recebem um dicionário para procurar que palavra chinesa, neste caso, é dicionário "utf-8", e que iria deixar de mostrar corretamente a palavra chinesa destina se você olhar em um dicionário diferente ou errado (usando um método de decodificação diferente).

No caso acima, o processo de um computador para procurar palavra chinesa é decodificação ().

E o processo de computador escrevendo os chineses na memória do computador é encode ().

assim que a informação é codificam os bytes brutos, e a informação descodificada é os bytes crus e o nome do dicionário para referenciar (mas não o próprio dicionário).

Respondeu 03/01/2018 em 07:16
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more