Estou realmente confuso. Tentei codificar mas o erro disse can't decode...
.
>>> "你好".encode("utf8")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)
Eu sei como evitar o erro com o prefixo "u" na string. Só estou me perguntando por que o erro é "não é possível decodificar" quando encode foi chamado. O que o Python está fazendo nos bastidores?
python
python-2.7
unicode
python-2.x
python-unicode
Thoslin
fonte
fonte
"你好".decode('utf-8').encode('utf-8')
Sempre codifique de Unicode para bytes.
Nesse sentido, você pode escolher a codificação .
A outra maneira é decodificar de bytes para Unicode.
Nesse sentido, você deve saber qual é a codificação .
Este ponto nunca pode ser enfatizado o suficiente. Se você quiser evitar jogar "whack-a-mole" unicode, é importante entender o que está acontecendo no nível dos dados. Aqui é explicado de outra maneira:
decode
-lo.encode
-lo.Agora, ao ver
.encode
uma string de bytes, Python 2 primeiro tenta convertê-la implicitamente em texto (umunicode
objeto). Da mesma forma, ao ver.decode
uma string Unicode, o Python 2 tenta implicitamente convertê-la em bytes (umstr
objeto).Essas conversões implícitas são o motivo pelo qual você pode obter quando liga . É porque a codificação geralmente aceita um parâmetro do tipo ; ao receber um parâmetro, há uma decodificação implícita em um objeto do tipo antes de recodificá-lo com outra codificação. Esta conversão escolhe um decodificador 'ascii' padrão † , dando a você o erro de decodificação dentro de um codificador.
Unicode
Decode
Error
encode
unicode
str
unicode
De fato, em Python 3 os métodos
str.decode
ebytes.encode
nem sequer existem. Sua remoção foi uma tentativa [controversa] de evitar essa confusão comum.† ... ou qualquer
sys.getdefaultencoding()
menção de codificação ; normalmente é 'ascii'fonte
_
refere-se ao valor anterior 2. porque esta é uma questão python-2.x.Você pode tentar isso
Ou
Você também pode tentar seguir
Adicione a seguinte linha no topo do seu arquivo .py.
fonte
Se estiver usando Python <3, você precisará informar ao intérprete que seu literal de string é Unicode, prefixando-o com
u
:Leitura adicional : Unicode HOWTO .
fonte
Você usa
u"你好".encode('utf8')
para codificar uma string Unicode. Mas se você quiser representar"你好"
, você deve decodificá-lo. Assim como:Você vai conseguir o que deseja. Talvez você deva aprender mais sobre codificação e decodificação.
fonte
Caso você esteja lidando com Unicode, às vezes em vez de
encode('utf-8')
, você também pode tentar ignorar os caracteres especiais, por exemploou conforme
something.decode('unicode_escape').encode('ascii','ignore')
sugerido aqui .Não é particularmente útil neste exemplo, mas pode funcionar melhor em outros cenários quando não é possível converter alguns caracteres especiais.
Alternativamente, você pode considerar a substituição de um caractere específico usando
replace()
.fonte
Se você estiver iniciando o interpretador python de um shell no Linux ou sistemas semelhantes (BSD, não tenho certeza sobre o Mac), você também deve verificar a codificação padrão para o shell.
Chame
locale charmap
do shell (não do interpretador python) e você veráSe este não for o caso, e você vir outra coisa, por exemplo
Python irá (pelo menos em alguns casos como no meu) herdar a codificação do shell e não será capaz de imprimir (alguns? Todos?) Caracteres Unicode. A própria codificação padrão do Python que você vê e controla por meio
sys.getdefaultencoding()
esys.setdefaultencoding()
, neste caso, é ignorada.Se você achar que tem esse problema, pode consertá-lo
(Ou, alternativamente, escolha qualquer mapa de teclado que você deseja em vez de en_EN.) Você também pode editar
/etc/locale.conf
(ou qualquer arquivo que governe a definição de localidade em seu sistema) para corrigir isso.fonte