Estou tendo alguns problemas ao tentar codificar uma string em UTF-8. Tentei várias coisas, incluindo usar string.encode('utf-8')
e unicode(string)
, mas recebo o erro:
UnicodeDecodeError: o codec 'ascii' não pode decodificar o byte 0xef na posição 1: ordinal fora do intervalo (128)
Esta é minha string:
(。・ω・。)ノ
Eu não vejo o que está errado, alguma ideia?
Edit: O problema é que imprimir a string como está não é exibida corretamente. Além disso, este erro quando tento convertê-lo:
Python 2.7.1+ (r271:86832, Apr 11 2011, 18:13:53)
[GCC 4.5.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> s = '(\xef\xbd\xa1\xef\xbd\xa5\xcf\x89\xef\xbd\xa5\xef\xbd\xa1)\xef\xbe\x89'
>>> s1 = s.decode('utf-8')
>>> print s1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 1-5: ordinal not in range(128)
Respostas:
Isso tem a ver com a codificação de seu terminal não sendo definida como UTF-8. Aqui está meu terminal
No meu terminal, o exemplo funciona com o acima, mas se eu me livrar da
LANG
configuração, não funcionaráConsulte os documentos de sua variante do Linux para descobrir como tornar essa mudança permanente.
fonte
sudo apt-get install language-pack-de
ousudo locale-gen de_DE.UTF-8
(para localidades alemãs).LC_ALL
, e o valor mais simples que corrige isso éC.UTF-8
experimentar:
editar:
'(\xef\xbd\xa1\xef\xbd\xa5\xcf\x89\xef\xbd\xa5\xef\xbd\xa1)\xef\xbe\x89'.decode('utf-8')
dáu'(\uff61\uff65\u03c9\uff65\uff61)\uff89'
, o que é correto.então o seu problema deve estar em algum lugar diferente, possivelmente se você tentar fazer algo com ele onde houver uma conversão implícita em andamento (pode ser impressão, gravação em um fluxo ...)
para dizer mais, precisamos ver alguns códigos.
fonte
UnicodeEncodeError: 'charmap' codec can't encode characters in position 1-5: character maps to <undefined>
'(\xef\xbd\xa1\xef\xbd\xa5\xcf\x89\xef\xbd\xa5\xef\xbd\xa1)\xef\xbe\x89'
(´¢í´¢Ñ¤ë´¢Ñ´¢í)´¥ë
.string
é codificado em utf8. se você imprimir, ele apenas enviará os bytes para o fluxo de saída, e se seu terminal não interpretar como utf8, você acabará com lixo. comdecode
você convertê-lo para Unicode, você podeencode
fazê-lo novamente para uma codificação que seu terminal entenda.Meu +1 ao comentário de mata em https://stackoverflow.com/a/10561979/1346705 e à demonstração de Nick Craig-Wood. Você decodificou a string corretamente. O problema é com o
print
comando, pois ele converte a string Unicode para a codificação do console, e o console não é capaz de exibir a string. Tente escrever a string em um arquivo e veja o resultado usando algum editor decente que suporte Unicode:Então você verá
(。・ω・。)ノ
.fonte
Se você estiver trabalhando em um host remoto , verifique no
/etc/ssh/ssh_config
seu PC local .Quando este arquivo contém uma linha:
comente-o adicionando
#
no início da linha. Isso pode ajudar.Com esta linha,
ssh
envia variáveis de ambiente relacionadas ao idioma de seu PC para o host remoto . Isso causa muitos problemas.fonte
Tente definir a codificação padrão do sistema como
utf-8
no início do script, para que todas as strings sejam codificadas usando-a.fonte
Não há problema em usar o código abaixo no início do script, conforme sugerido por Andrei Krasutski .
Mas vou sugerir que você também adicione uma
# -*- coding: utf-8 -*
linha bem no início do script.Omitir isso gera erro abaixo no meu caso quando tento executar
basic.py
.A seguir está o código presente no
basic.py
qual lança o erro acima.código com erro
Então eu adicionei a
# -*- coding: utf-8 -*-
linha no topo e executei. Funcionou.código sem erro
Obrigado.
fonte
#coding: utf-8
em vez# -*- coding: utf-8 -*-
disso é mais fácil de lembrar. Funciona imediatamente com o Python PEP 263 - Definindo codificações de código-fonte do Python .Sem problemas com meu terminal. As respostas acima me ajudaram a procurar as direções certas, mas não funcionou para mim até que eu adicionei
'ignore'
:Conforme indicado no comentário abaixo, isso pode levar a resultados indesejados. OTOH também pode funcionar bem o suficiente para fazer as coisas funcionarem e você não se importa em perder alguns personagens.
fonte
isso funciona para ubuntu 15.10:
fonte
Parece que sua string está codificada
utf-8
, então qual é exatamente o problema? Ou o que você está tentando fazer aqui ..?fonte
(´¢í´¢Ñ¤ë´¢Ñ´¢í)´¥ë
, quero que codifique corretamente.No meu caso, foi causado pelo meu arquivo Unicode sendo salvo com um "BOM". Para resolver isso, abri o arquivo usando o BBEdit e fiz um "Salvar como ..." escolhendo a codificação "Unicode (UTF-8)" e não o que veio com "Unicode (UTF-8, com BOM) "
fonte
Eu estava recebendo o mesmo tipo de erro e descobri que o console não é capaz de exibir a string em outro idioma. Portanto, fiz as alterações de código abaixo para definir default_charset como UTF-8.
fonte
Esta é a melhor resposta: https://stackoverflow.com/a/4027726/2159089
no linux:
então
sys.stdout.encoding
está OK.fonte
BOM, muitas vezes é BOM para mim
vi o arquivo, use
e salve-o. Isso quase sempre corrige no meu caso
fonte
Eu tive o mesmo erro, com URLs contendo caracteres não ascii (bytes com valores> 128)
Funcionou para mim, no Python 2.7, suponho que essa atribuição mudou 'algo' na
str
representação interna - ou seja, ela força a decodificação correta da sequência de bytes apoiadaurl
e finalmente coloca a string em um utf-8str
com toda a magia em O lugar certo. Unicode em Python é magia negra para mim. Espero que seja útilfonte
eu resolvo esse problema mudando no arquivo settings.py com 'ENGINE': 'django.db.backends.mysql', não use 'ENGINE': 'mysql.connector.django',
fonte
Basta converter o texto explicitamente em string usando
str()
. Funcionou para mim.fonte