UnicodeEncodeError: o codec 'ascii' não pode codificar o caractere u '\ xa0' na posição 20: ordinal fora do intervalo (128)

1298

Estou tendo problemas para lidar com caracteres unicode do texto buscado em diferentes páginas da web (em sites diferentes). Estou usando o BeautifulSoup.

O problema é que o erro nem sempre é reproduzível; às vezes funciona com algumas páginas e, às vezes, vomita jogando a UnicodeEncodeError. Eu tentei praticamente tudo o que consigo pensar e, no entanto, não encontrei nada que funcionasse de maneira consistente sem gerar algum tipo de erro relacionado ao Unicode.

Uma das seções do código que está causando problemas é mostrada abaixo:

agent_telno = agent.find('div', 'agent_contact_number')
agent_telno = '' if agent_telno is None else agent_telno.contents[0]
p.agent_info = str(agent_contact + ' ' + agent_telno).strip()

Aqui está um rastreamento de pilha produzido em ALGUMAS strings quando o snippet acima é executado:

Traceback (most recent call last):
  File "foobar.py", line 792, in <module>
    p.agent_info = str(agent_contact + ' ' + agent_telno).strip()
UnicodeEncodeError: 'ascii' codec can't encode character u'\xa0' in position 20: ordinal not in range(128)

Suspeito que isso ocorra porque algumas páginas (ou mais especificamente, páginas de alguns dos sites) podem ser codificadas, enquanto outras podem não ser codificadas. Todos os sites são baseados no Reino Unido e fornecem dados destinados ao consumo no Reino Unido - portanto, não há problemas relacionados à internalização ou ao tratamento de texto escrito em outro idioma que não seja o inglês.

Alguém tem alguma idéia de como resolver isso, para que eu possa consistentemente corrigir esse problema?

Homunculus Reticulli
fonte
1
Se você está recebendo esses erros como usuário e não como desenvolvedor, verifique serverfault.com/questions/54591/… e askubuntu.com/questions/599808/…
aquele cara brasileiro
Acrescentarei este ponto, não use onlinegdb.com/online_python_interpreter para essas coisas. Estava usando esse intérprete para testar as coisas e não está configurado corretamente para Unicode! Estava sempre imprimindo no formato 'B' \ nnn '' ... quando tudo que eu queria era um guillemet! Tentou em uma VM e funcionou imediatamente como esperado usando chr ()
JGFMK
4
Tente isso import os; import locale; os.environ["PYTHONIOENCODING"] = "utf-8"; myLocale=locale.setlocale(category=locale.LC_ALL, locale="en_GB.UTF-8"); ... print(myText.encode('utf-8', errors='ignore')).
Hhh
@hhh Corri o trecho NameError: nome 'myText' não está definido
KHAN irfan
9
Tente definir PYTHONIOENCODING no shell, antes de executar o seu script:$ export PYTHONIOENCODING=utf8
Noam Manos

Respostas:

1364

Você precisa ler o HOWTO Unicode do Python . Este erro é o primeiro exemplo .

Basicamente, pare de usar strpara converter de unicode em texto / bytes codificados.

Em vez disso, use corretamente .encode()para codificar a sequência:

p.agent_info = u' '.join((agent_contact, agent_telno)).encode('utf-8').strip()

ou trabalhe inteiramente em unicode.

agf
fonte
23
acordado! Uma boa regra prática que me ensinou é usar a idéia do "sanduíche unicode". Seu script aceita bytes do mundo exterior, mas todo o processamento deve ser feito em unicode. Somente quando você estiver pronto para enviar seus dados, eles deverão ser convertidos em bytes!
Andbdrew
256
Caso alguém fique confuso com isso, eu achei uma coisa estranha: meu terminal usa utf-8 e, quando eu uso printminhas cordas utf-8, ele funciona muito bem. No entanto, quando canalizo a saída dos meus programas para um arquivo, ele lança a UnicodeEncodeError. De fato, quando a saída é redirecionada (para um arquivo ou canal), acho que sys.stdout.encodingé None! Pregar .encode('utf-8')resolve o problema.
Drevicko
93
@drevicko: use em PYTHONIOENCODING=utf-8vez disso, ou seja, imprima seqüências Unicode e deixe o ambiente definir a codificação esperada.
JFS
1
@ steinar: nada é válido em todos os casos. Em geral, um usuário não deve se importar em usar o Python para implementar seu utilitário (a interface não deve mudar se você decidir reimplementá-lo em outro idioma por qualquer motivo) e, portanto, você não deve esperar que o usuário esteja ciente do python- envvores específicos. É uma má interface do usuário forçar o usuário a especificar a codificação de caracteres; incorpore a codificação de caracteres no formato do relatório, se necessário. Nota: nenhuma codificação codificada permanentemente pode ser "padrão sensível" no caso geral.
JFS
13
Este é um conselho ruim e confuso. O motivo pelo qual as pessoas usam str é porque o objeto NÃO é uma string, portanto, não há um .encode()método para chamar.
Cerin 05/10
434

Este é um ponto de dor clássico do unicode python! Considere o seguinte:

a = u'bats\u00E0'
print a
 => batsà

Tudo bem até agora, mas se chamarmos str (a), vamos ver o que acontece:

str(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe0' in position 4: ordinal not in range(128)

Oh, mergulho, isso não vai fazer bem a ninguém! Para corrigir o erro, codifique os bytes explicitamente com .encode e diga ao python qual codec usar:

a.encode('utf-8')
 => 'bats\xc3\xa0'
print a.encode('utf-8')
 => batsà

Voil \ u00E0!

O problema é que, quando você chama str (), python usa a codificação de caracteres padrão para tentar codificar os bytes que você forneceu, que no seu caso às vezes são representações de caracteres unicode. Para corrigir o problema, você precisa dizer ao python como lidar com a string fornecida usando .encode ('Whatever_unicode'). Na maioria das vezes, você deve ficar bem usando utf-8.

Para uma excelente exposição sobre esse assunto, consulte a conversa PyCon de Ned Batchelder aqui: http://nedbatchelder.com/text/unipain.html

Andbdrew
fonte
85
Nota pessoal: Ao tentar digitar ".encode", não digite acidentalmente ".unicode", e pergunte-se por que nada está funcionando.
Skip Huffman
9
Bom conselho. Mas o que você faz quando usa str (x) para imprimir objetos que podem ou não ser strings? str (x) funciona se x for um número, data e hora, sequência booleana ou normal. De repente, se é um unicode, ele pára de funcionar. Existe uma maneira de obter o mesmo comportamento ou agora precisamos adicionar uma verificação IF para testar se o objeto é string para usar .encode e str () caso contrário?
Dirk R
A mesma pergunta pode ser feita com Nonevalor.
Vadorequest
210

Encontrei um trabalho elegante para remover símbolos e continuar mantendo a string como a seguir:

yourstring = yourstring.encode('ascii', 'ignore').decode('ascii')

É importante notar que o uso da opção ignorar é perigoso, pois elimina silenciosamente qualquer suporte a unicode (e internacionalização) do código que o utiliza, como pode ser visto aqui (converter unicode):

>>> u'City: Malmö'.encode('ascii', 'ignore').decode('ascii')
'City: Malm'
Max Korolevsky
fonte
17
Você fez meu dia! Para utf-8, é suficiente:yourstring = yourstring.encode('utf-8', 'ignore').decode('utf-8')
luca76 14/02
para mim, isso funcionou, mas meu caso era diferente, eu estava salvando nomes de arquivos e tendo "/" no nome e o caminho não existia, então tenho que usar .replace ("/", "") e, portanto, salvo meu script. enquanto ignorar o ascii também funciona para o caso 'utf-8'.
Akash Kandpal
1
@ harrypotter0 para concatenar os caminhos de arquivo corretamente os.path.join(), é um hábito muito bom quando você começa a programar em várias plataformas. :)
login_not_failed
152

Bem, eu tentei de tudo, mas não ajudou. Depois de pesquisar no Google, percebi o seguinte e ajudou. python 2.7 está em uso.

# encoding=utf8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
Ashwin
fonte
7
Não faça isso. stackoverflow.com/questions/3828723/… , embora quando você tenha respostas como essa stackoverflow.com/a/31137935/2141635 esteja perto do topo dos resultados ao pesquisar o erro, posso ver por que pode parecer uma boa idéia.
Padraic Cunningham
21
Tentei quase todas as sugestões deste tópico e realmente nenhuma funcionou para mim. Finalmente eu tentei este. E é realmente o único que funcionou simples e bom. Se alguém dizer "não faça isso, então venha com um simples Solução Caso contrário, use um presente, porque é uma boa cópia de trabalho e solução de passado...
Richard de Ree
4
Como isso pode ser feito em python3? Ficaria feliz em saber.
precisa
3
Depois de tanta frustração, este funcionou. Muito obrigado.
Avraham Zhurba
4
Eu apenas adicionaria umif sys.version_info.major < 3:
contrato do Prof. Falken violou
87

Um problema sutil que causa falha na impressão é ter as variáveis ​​de ambiente definidas incorretamente, por exemplo. aqui LC_ALL definido como "C". No Debian, eles desencorajam defini-lo: Debian wiki on Locale

$ echo $LANG
en_US.utf8
$ echo $LC_ALL 
C
$ python -c "print (u'voil\u00e0')"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe0' in position 4: ordinal not in range(128)
$ export LC_ALL='en_US.utf8'
$ python -c "print (u'voil\u00e0')"
voilà
$ unset LC_ALL
$ python -c "print (u'voil\u00e0')"
voilà
maxpolk
fonte
O problema foi exatamente o mesmo, por isso não verifiquei antes de relatar . Muito obrigado. A propósito, você pode substituir os dois primeiros comandos por env|grep -E '(LC|LANG)'.
Dmitry Verhoturov 08/0815
Apenas meus dois centavos na questão da codificação errada. Eu freqüentemente usam mcem "modo subshell" ( Ctrl-O) e também se esqueceu de que eu adicionei o seguinte apelido para bash: alias mc="LANG=en_EN.UTF-8 mc". Então, quando tentei executar scripts mal escritos, que dependem ru_RU.UTF-8internamente, eles simplesmente morrem. Tentei muitas coisas desse tópico antes de descobrir o problema real. :)
login_not_failed
VOCÊ É DEMAIS. No GSUTIL, meu rsync estava falhando devido exatamente a esse problema. Corrigido o LC_ALL e tudo funciona bem como vinho. <3 OBRIGADO <3
dsignr 23/12/19
27

Para mim, o que funcionou foi:

BeautifulSoup(html_text,from_encoding="utf-8")

Espero que isso ajude alguém.

Animesh
fonte
25

Na verdade, descobri que, na maioria dos meus casos, remover esses caracteres é muito mais simples:

s = mystring.decode('ascii', 'ignore')
Phil LaNasa
fonte
26
"Perfeitamente" geralmente não é o que executa. Ele joga fora coisas que você deve descobrir como lidar adequadamente.
Tripleee
7
apenas remover "esses" caracteres (não em inglês) não é a solução, já que o python deve suportar todos os idiomas, você não acha?
alemol
8
Votado. Esta não é a solução correta. Saiba como trabalhar com Unicode: joelonsoftware.com/articles/Unicode.html
Andrew Ferrier
4
Veja, a maneira mais criteriosa de apresentar essa resposta em particular é da seguinte maneira: reconhecer que o ascii confere um certo privilégio a determinados idiomas e usuários - essa é a escotilha de escape que pode ser explorada para os usuários que podem estar invadindo uma primeira passagem superficial , script juntos potencialmente para o trabalho preliminar antes da implementação do suporte unicode completo.
lol
5
Se estou escrevendo um script que só precisa imprimir texto em inglês para stdout em um aplicativo interno da empresa, só quero que o problema desapareça. O que quer que funcione.
kagronick
25

O problema é que você está tentando imprimir um caractere unicode, mas seu terminal não o suporta.

Você pode tentar instalar o language-pack-enpacote para corrigir isso:

sudo apt-get install language-pack-en

que fornece atualizações de dados de tradução em inglês para todos os pacotes suportados (incluindo Python). Instale um pacote de idioma diferente, se necessário (dependendo dos caracteres que você está tentando imprimir).

Em algumas distribuições Linux, é necessário para garantir que as localidades padrão em inglês estejam configuradas corretamente (para que os caracteres unicode possam ser manipulados pelo shell / terminal). Às vezes, é mais fácil instalá-lo do que configurá-lo manualmente.

Então, ao escrever o código, use a codificação correta no seu código.

Por exemplo:

open(foo, encoding='utf-8')

Se você ainda tiver um problema, verifique novamente a configuração do sistema, como:

  • Seu arquivo de localidade ( /etc/default/locale), que deve ter, por exemplo,

    LANG="en_US.UTF-8"
    LC_ALL="en_US.UTF-8"

    ou:

    LC_ALL=C.UTF-8
    LANG=C.UTF-8
  • Valor de LANG/ LC_CTYPEno shell.

  • Verifique qual localidade seu shell suporta:

    locale -a | grep "UTF-8"

Demonstrando o problema e a solução em uma nova VM.

  1. Inicialize e provisione a VM (por exemplo, usando vagrant):

    vagrant init ubuntu/trusty64; vagrant up; vagrant ssh

    Veja: caixas Ubuntu disponíveis . .

  2. Impressão de caracteres unicode (como sinal de marca comercial ):

    $ python -c 'print(u"\u2122");'
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
    UnicodeEncodeError: 'ascii' codec can't encode character u'\u2122' in position 0: ordinal not in range(128)
  3. Agora instalando language-pack-en:

    $ sudo apt-get -y install language-pack-en
    The following extra packages will be installed:
      language-pack-en-base
    Generating locales...
      en_GB.UTF-8... /usr/sbin/locale-gen: done
    Generation complete.
  4. Agora o problema deve ser resolvido:

    $ python -c 'print(u"\u2122");'
    
  5. Caso contrário, tente o seguinte comando:

    $ LC_ALL=C.UTF-8 python -c 'print(u"\u2122");'
    
kenorb
fonte
1
O que tem language-pack-ena ver com Python ou com essa pergunta? AFAIK, pode fornecer traduções de idiomas para mensagens, mas não tem nada a ver com codificação
Alastair McCormack
2
Em algumas distribuições Linux, é necessário para garantir que as localidades padrão em inglês estejam configuradas corretamente, especialmente ao executar o script Python no Terminal. Funcionou para mim em um ponto. Veja: codificação de caracteres
kenorb
Ah ok. Quer dizer, se você deseja usar um código de idioma que não seja o inglês? Eu acho que o usuário também terá que editar /etc/locale.genpara garantir que a localidade seja criada antes de usá-la?
Alastair McCormack
1
@AlastairMcCormack comentada LANGa partir /etc/default/locale(como /etc/locale.genexistem does't) e correu locale-gen, mas não ajudou. Não sei o que language-pack-enexatamente faz, pois não encontrei muita documentação e listar o conteúdo dela não ajuda muito.
kenorb
1
é improvável que não exista localidades utf-8 em um sistema de desktop, ou seja, é provável que você não precise instalar nada, apenas configure LANG/ LC_CTYPE/ LC_ALL(em vez disso LANG=C.UTF-8).
JFS
19

Com casca:

  1. Localize a localidade UTF-8 suportada pelo seguinte comando:

    locale -a | grep "UTF-8"
  2. Exporte-o antes de executar o script, por exemplo:

    export LC_ALL=$(locale -a | grep UTF-8)

    ou manualmente como:

    export LC_ALL=C.UTF-8
  3. Teste-o imprimindo caracteres especiais, por exemplo :

    python -c 'print(u"\u2122");'

Acima testado no Ubuntu.

kenorb
fonte
Sim, esta é a melhor resposta curta, não podemos modificar o código-fonte para usar .encode
Nguyen - Neo.Mxn0
16

Adicione a linha abaixo no início do seu script (ou como segunda linha):

# -*- coding: utf-8 -*-

Essa é a definição da codificação do código-fonte python. Mais informações em PEP 263 .

Andriy Ivaneyko
fonte
2
Isso não resolve o problema quando o texto processado carregado de um arquivo externo contém codificações utf-8. Isso ajuda apenas para literais escritos no próprio script python fornecido e é apenas uma pista para o intérprete python, mas não tem impacto no processamento de texto.
Mikaelblomkvistsson
16

Aqui está uma retrospectiva de algumas outras respostas ditas "cop out". Há situações em que simplesmente jogar fora os caracteres / cordas problemáticos é uma boa solução, apesar dos protestos expressos aqui.

def safeStr(obj):
    try: return str(obj)
    except UnicodeEncodeError:
        return obj.encode('ascii', 'ignore').decode('ascii')
    except: return ""

Testando:

if __name__ == '__main__': 
    print safeStr( 1 ) 
    print safeStr( "test" ) 
    print u'98\xb0'
    print safeStr( u'98\xb0' )

Resultados:

1
test
98°
98

Sugestão: você pode nomear essa função em toAsciivez disso? Essa é uma questão de preferência.

Isso foi escrito para o Python 2. Para o Python 3, acredito que você queira usar em bytes(obj,"ascii")vez de str(obj). Ainda não testei isso, mas em algum momento revisarei a resposta.

BuvinJ
fonte
8

Eu sempre coloco o código abaixo nas duas primeiras linhas dos arquivos python:

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
Pereira
fonte
6

Funções auxiliares simples encontradas aqui .

def safe_unicode(obj, *args):
    """ return the unicode representation of obj """
    try:
        return unicode(obj, *args)
    except UnicodeDecodeError:
        # obj is byte string
        ascii_text = str(obj).encode('string_escape')
        return unicode(ascii_text)

def safe_str(obj):
    """ return the byte string representation of obj """
    try:
        return str(obj)
    except UnicodeEncodeError:
        # obj is unicode
        return unicode(obj).encode('unicode_escape')
Parag Tyagi
fonte
Para obter o escapou sequência de bytes (para converter seqüência de caracteres Unicode arbitrário bytes usando codificação ascii), você poderia usar backslashreplacemanipulador de erro: u'\xa0'.encode('ascii', 'backslashreplace'). Embora você deva evitar essa representação e configurar seu ambiente para aceitar caracteres não-ascii - é 2016!
JFS
Feliz Ano Novo @JFSebastian. Fiquei frustrado com o problema do Python-Unicode e finalmente consegui esta solução que estava funcionando. Eu não sabia disso. De qualquer forma obrigado pela dica.
Parag Tyagi 01/01
6

Basta adicionar a uma codificação variável ('utf-8')

agent_contact.encode('utf-8')
Kairat Koibagarov
fonte
4

Por favor, abra o terminal e dispare o comando abaixo:

export LC_ALL="en_US.UTF-8"
Hồ Ngọc Vượng
fonte
3

Eu apenas usei o seguinte:

import unicodedata
message = unicodedata.normalize("NFKD", message)

Verifique o que a documentação diz sobre isso:

unicodedata.normalize (form, unistr) Retorna o formulário normal para a cadeia Unicode unistr. Os valores válidos para o formulário são 'NFC', 'NFKC', 'NFD' e 'NFKD'.

O padrão Unicode define várias formas de normalização de uma cadeia Unicode, com base na definição de equivalência canônica e equivalência de compatibilidade. No Unicode, vários caracteres podem ser expressos de várias maneiras. Por exemplo, o caractere U + 00C7 (LETRA CAPITAL LATINA C COM CEDILHA) também pode ser expresso como a sequência U + 0043 (LETRA CAPITAL LATINA C) U + 0327 (CEDILLA COMBINADA).

Para cada caractere, existem duas formas normais: a forma normal C e a forma normal D. A forma normal D (NFD) também é conhecida como decomposição canônica e traduz cada caractere em sua forma decomposta. A forma normal C (NFC) primeiro aplica uma decomposição canônica e depois compõe caracteres pré-combinados novamente.

Além dessas duas formas, existem duas formas normais adicionais baseadas na equivalência de compatibilidade. No Unicode, há suporte para certos caracteres que normalmente seriam unificados com outros caracteres. Por exemplo, U + 2160 (ROMAN NUMERAL ONE) é realmente a mesma coisa que U + 0049 (LETRA DE CAPITAL LATINA I). No entanto, ele é suportado no Unicode para compatibilidade com conjuntos de caracteres existentes (por exemplo, gb2312).

A forma normal KD (NFKD) aplicará a decomposição de compatibilidade, ou seja, substitua todos os caracteres de compatibilidade por seus equivalentes. A forma normal KC (NFKC) aplica primeiro a decomposição de compatibilidade, seguida pela composição canônica.

Mesmo que duas seqüências unicode sejam normalizadas e pareçam iguais a um leitor humano, se uma possui caracteres combinados e a outra não, elas podem não ser iguais.

Resolve para mim. Simples e fácil.

Drag0
fonte
3

Abaixo solução funcionou para mim, apenas adicionou

u "String"

(representando a string como unicode) antes da minha string.

result_html = result.to_html(col_space=1, index=False, justify={'right'})

text = u"""
<html>
<body>
<p>
Hello all, <br>
<br>
Here's weekly summary report.  Let me know if you have any questions. <br>
<br>
Data Summary <br>
<br>
<br>
{0}
</p>
<p>Thanks,</p>
<p>Data Team</p>
</body></html>
""".format(result_html)
Aravind Krishnakumar
fonte
3

Infelizmente isso funciona em Python 3, pelo menos ...

Python 3

Às vezes, o erro está nas variáveis ​​do ambiente e envolve tanto

import os
import locale
os.environ["PYTHONIOENCODING"] = "utf-8"
myLocale=locale.setlocale(category=locale.LC_ALL, locale="en_GB.UTF-8")
... 
print(myText.encode('utf-8', errors='ignore'))

onde erros são ignorados na codificação.

hhh
fonte
2

Acabei de ter esse problema, e o Google me levou aqui, então, para adicionar às soluções gerais aqui, é isso que funcionou para mim:

# 'value' contains the problematic data
unic = u''
unic += value
value = unic

Tive essa ideia depois de ler a apresentação de Ned .

Mas não pretendo entender completamente por que isso funciona. Portanto, se alguém puder editar esta resposta ou colocar um comentário para explicar, eu aprecio isso.

pepoluan
fonte
3
Qual é o typevalor? antes e depois disso? Eu acho que por que isso funciona é que, fazendo um unic += valueque é o mesmo que unic = unic + valuevocê está adicionando uma string e um unicode, onde python assume unicode para o resultante, unicou seja, o tipo mais preciso (pense em quando você faz isso a = float(1) + int(1), atorna-se um float) e depois value = unicaponta valuepara o novo unicobjeto que passa a ser unicode.
Tom Myddeltyn
2

Ocorreu esse erro ao executar manage.py migrateno Django com equipamentos localizados.

Nossa fonte continha a # -*- coding: utf-8 -*-declaração, o MySQL foi configurado corretamente para utf8 e o Ubuntu tinha o pacote de idiomas e os valores apropriados /etc/default/locale.

A questão era simplesmente que o contêiner do Django (usamos o docker) estava com falta do LANGenv var.

Configuração LANGpara en_US.UTF-8e reiniciar o recipiente antes de migrações re-executar corrigiu o problema.

followben
fonte
1

Muitas respostas aqui (@agf e @Andbdrew, por exemplo) já abordaram os aspectos mais imediatos da questão do OP.

No entanto, acho que há um aspecto sutil, mas importante, que foi amplamente ignorado e que é muito importante para todos que gostam de mim aqui, enquanto tentam entender as codificações em Python: o gerenciamento de representação de caracteres em Python: Python 2 vs Python 3 é muito diferente . Eu sinto que um grande pedaço de confusão por aí tem a ver com pessoas lendo sobre codificações em Python sem estar ciente da versão.

Sugiro que qualquer pessoa interessada em entender a causa raiz do problema do OP comece lendo a introdução de Spolsky às representações de caracteres e Unicode e depois vá para Batchelder no Unicode no Python 2 e Python 3.

Simón Ramírez Amaya
fonte
sim, meu erro ocorreu no python 2.7, 'a'.format (u'ñ'), e a solução correta é não usar .encode ('utf-8'), mas sempre usar strings unicode (o padrão no python 3 ): u'a'.format (u'ñ '),
Rogelio
1

Tente evitar a conversão de variável em str (variável). Às vezes, pode causar o problema.

Dica simples para evitar:

try: 
    data=str(data)
except:
    data = data #Don't convert to String

O exemplo acima também resolverá o erro de codificação.

Sam Ruben
fonte
este trabalho doens't como você só vai correr para o erro na exceção
Aurele Collinet
0

Se você tiver algo parecido packet_data = "This is data", faça isso na próxima linha, logo após a inicialização packet_data:

unic = u''
packet_data = unic
Nandan Kulkarni
fonte
0

Eu tive esse problema tentando gerar caracteres Unicode stdout, mas comsys.stdout.write , em vez de imprimir (para que eu também pudesse suportar a saída para um arquivo diferente).

Na documentação do BeautifulSoup , resolvi isso com a biblioteca de codecs:

import sys
import codecs

def main(fIn, fOut):
    soup = BeautifulSoup(fIn)
    # Do processing, with data including non-ASCII characters
    fOut.write(unicode(soup))

if __name__ == '__main__':
    with (sys.stdin) as fIn: # Don't think we need codecs.getreader here
        with codecs.getwriter('utf-8')(sys.stdout) as fOut:
            main(fIn, fOut)
palswim
fonte
0

Esse problema geralmente ocorre quando um projeto django é implementado usando o Apache. Como o Apache define a variável de ambiente LANG = C em / etc / sysconfig / httpd. Basta abrir o arquivo e comentar (ou alterar para o seu flavior) essa configuração. Ou use a opção lang do comando WSGIDaemonProcess; nesse caso, você poderá definir diferentes variáveis ​​de ambiente LANG para diferentes virtualhosts.

shmakovpn
fonte
0

A solução recomendada não funcionou para mim, e eu poderia viver com o dumping de todos os caracteres não ascii, portanto

s = s.encode('ascii',errors='ignore')

o que me deixou com algo despido que não gera erros.

Gulzar
fonte
0

Isso funcionará:

 >>>print(unicodedata.normalize('NFD', re.sub("[\(\[].*?[\)\]]", "", "bats\xc3\xa0")).encode('ascii', 'ignore'))

Resultado:

>>>bats
Huzefa Usama
fonte