UnicodeEncodeError: il codec 'ascii' non può codificare il carattere u '\ xa0' in posizione 20: ordinale non compreso nell'intervallo (128)


1298

Sto riscontrando problemi con i caratteri unicode da testo recuperato da diverse pagine Web (su siti diversi). Sto usando BeautifulSoup.

Il problema è che l'errore non è sempre riproducibile; a volte funziona con alcune pagine e, a volte, fa un salto lanciando a UnicodeEncodeError. Ho provato praticamente tutto quello che mi viene in mente, eppure non ho trovato nulla che funzioni in modo coerente senza generare alcun tipo di errore relativo a Unicode.

Una delle sezioni di codice che causa problemi è mostrata di seguito:

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

Ecco una traccia dello stack prodotta su ALCUNE stringhe quando viene eseguito lo snippet sopra:

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)

Sospetto che ciò sia dovuto al fatto che alcune pagine (o più specificamente, pagine di alcuni siti) potrebbero essere codificate, mentre altre potrebbero non essere codificate. Tutti i siti hanno sede nel Regno Unito e forniscono dati destinati al consumo nel Regno Unito, quindi non ci sono problemi relativi all'internalizzazione o alla gestione di testi scritti in inglese.

Qualcuno ha qualche idea su come risolverlo in modo che io possa RISOLVERE SOLAMENTE questo problema?


1
Se ricevi questi errori come utente piuttosto che come sviluppatore, controlla serverfault.com/questions/54591/… e askubuntu.com/questions/599808/…
Quel ragazzo brasiliano,

Aggiungerò questo punto non usare onlinegdb.com/online_python_interpreter per queste cose. Stavo usando quell'interprete per provare le cose e non è configurato correttamente per Unicode! Stavo sempre stampando in un formato 'B' \ nnn '' ... quando tutto quello che volevo era un guillemet! Ho provato su una VM e ha funzionato immediatamente come previsto usando chr ()
JGFMK il

4
Prova questo 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 ho eseguito lo snippet NameError: il nome 'myText' non è definito
KHAN irfan,

9
Prova a impostare PYTHONIOENCODING nella shell, prima di eseguire il tuo script:$ export PYTHONIOENCODING=utf8
Noam Manos

Risposte:


1364

Devi leggere il Python Unicode HOWTO . Questo errore è il primo esempio .

Fondamentalmente, smetti di usare strper convertire da Unicode a testo / byte codificati.

Invece, usa correttamente .encode()per codificare la stringa:

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

o funziona interamente in Unicode.


23
concordato! una buona regola empirica che mi è stato insegnato è di usare l'idea del "sandwich unicode". Lo script accetta byte dal mondo esterno, ma tutta l'elaborazione deve essere eseguita in unicode. Solo quando sei pronto per l'output dei tuoi dati, questi dovrebbero essere ricondotti in byte!
Andbdrew,

256
Nel caso in cui qualcun altro venga confuso da questo, ho trovato una cosa strana: il mio terminale usa utf-8, e quando ho le printmie stringhe utf-8 funziona bene. Tuttavia, quando installo l'output dei miei programmi in un file, viene generato un UnicodeEncodeError. Infatti, quando l'uscita viene reindirizzato (in un file o una pipe), trovo che sys.stdout.encodingsia None! Affrontare .encode('utf-8')risolve il problema.
drevicko,

93
@drevicko: usa PYTHONIOENCODING=utf-8invece ie, stampa stringhe Unicode e lascia che l'ambiente imposti la codifica prevista.
jfs

1
@steinar: nulla è valido in ogni caso. In generale, un utente non dovrebbe preoccuparsi di usare Python per implementare la tua utility (l'interfaccia non dovrebbe cambiare se decidi di reimplementarla in un'altra lingua per qualsiasi motivo) e quindi non dovresti aspettarti che l'utente sia a conoscenza di python- avvocati specifici. È una cattiva interfaccia utente forzare l'utente a specificare la codifica dei caratteri; incorporare la codifica dei caratteri nel formato del report, se necessario. Nota: nessuna codifica codificata può essere "impostazione predefinita sensata" nel caso generale.
jfs,

13
Questo è un consiglio cattivo e confuso. Il motivo per cui le persone usano str è perché l'oggetto NON È già una stringa, quindi non esiste un .encode()metodo da chiamare.
Cerin,

434

Questo è un classico punto di dolore unicode in pitone! Considera quanto segue:

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

Tutto bene finora, ma se chiamiamo str (a), vediamo cosa succede:

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 tuffo, non farà bene a nessuno! Per correggere l'errore, codifica esplicitamente i byte con .encode e comunica a python quale codec utilizzare:

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

Voil \ u00E0!

Il problema è che quando chiami str (), python usa la codifica dei caratteri predefinita per provare a codificare i byte che gli hai dato, che nel tuo caso a volte sono rappresentazioni di caratteri unicode. Per risolvere il problema, devi dire a Python come gestire la stringa che gli dai usando .encode ('whatever_unicode'). Il più delle volte, dovresti stare bene usando utf-8.

Per un'eccellente esposizione su questo argomento, consultare la conferenza PyCon di Ned Batchelder qui: http://nedbatchelder.com/text/unipain.html


85
Nota personale: quando si tenta di digitare ".encode" non digitare accidentalmente ".unicode", quindi chiedersi perché non funziona nulla.
Skip Huffman,

9
Buon Consiglio. Ma cosa fai invece quando stavi usando str (x) per stampare oggetti che potrebbero essere o meno stringhe? str (x) funziona se x è un numero, una data, un valore booleano o una stringa normale. Improvvisamente, se si tratta di un unicode, smette di funzionare. C'è un modo per ottenere lo stesso comportamento o ora è necessario aggiungere un controllo IF per verificare se l'oggetto è una stringa da utilizzare .encode e str () altrimenti?
Dirk R,

La stessa domanda potrebbe essere posta con Nonevalore.
Vadorequest,

210

Ho trovato un lavoro elegante per me per rimuovere i simboli e continuare a mantenere la stringa come stringa nei seguenti:

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

È importante notare che l'uso dell'opzione ignora è pericoloso perché elimina silenziosamente qualsiasi supporto unicode (e internazionalizzazione) dal codice che lo utilizza, come visto qui (converti unicode):

>>> u'City: Malmö'.encode('ascii', 'ignore').decode('ascii')
'City: Malm'

17
Mi hai reso felice! Per utf-8, è sufficiente fare:yourstring = yourstring.encode('utf-8', 'ignore').decode('utf-8')
luca76

per me questo ha funzionato ma il mio caso era diverso, stavo salvando i nomi dei file e avevo "/" nel nome e il percorso non esisteva, quindi devo usare .replace ("/", "") e quindi salvato la mia sceneggiatura. ignorando l'ascii funziona anche per il caso 'utf-8'.
Akash Kandpal,

1
@ harrypotter0 per concatenare correttamente i percorsi dei file os.path.join(), è una buona abitudine quando inizi a fare la programmazione multipiattaforma. :)
login_not_failed

152

bene ho provato di tutto ma non mi è stato d'aiuto, dopo aver cercato su Google ho capito quanto segue e mi ha aiutato. python 2.7 è in uso.

# encoding=utf8
import sys
reload(sys)
sys.setdefaultencoding('utf8')

7
Non farlo stackoverflow.com/questions/3828723/… , anche se quando si hanno risposte come questa stackoverflow.com/a/31137935/2141635 vicino alla parte superiore dei risultati quando si cerca l'errore, posso vedere perché può sembrare una buona idea.
Padraic Cunningham,

21
Ho provato quasi tutti i suggerimenti in questo argomento e nessuno ha funzionato per me. Finalmente ho provato questo. Ed è davvero L'UNICO che ha funzionato in modo semplice e buono. Se qualcuno dice "Non farlo, allora vieni con una soluzione semplice. Altrimenti usa questa. Perché è una buona copia funzionante e una soluzione passata.
Richard de Ree,

4
Come è possibile farlo in python3? Sarei felice di saperlo.
Kanerva Peter,

3
Dopo tanta frustrazione ha funzionato. Grazie mille.
Avraham Zhurba,

4
Avevo solo aggiungere unif sys.version_info.major < 3:
contratto Prof. Falken violato

87

Un sottile problema che causa il fallimento della stampa è che le variabili di ambiente siano impostate in modo errato, ad es. qui LC_ALL impostato su "C". In Debian scoraggiano l'impostazione: Debian wiki su 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à

Ho riscontrato esattamente lo stesso problema, così grave che non l'ho verificato prima di segnalare . Molte grazie. A proposito, puoi sostituire i primi due comandi con env|grep -E '(LC|LANG)'.
Dmitry Verhoturov

Solo i miei due centesimi sulla questione della codifica sbagliata. Mi capita spesso di usare mcin "modalità subshell" ( Ctrl-O) e ho anche dimenticato che ho aggiunto le seguenti alias bash: alias mc="LANG=en_EN.UTF-8 mc". Quindi, quando ho provato a eseguire script scritti male che si basano ru_RU.UTF-8internamente, muoiono e basta. Ho provato molte cose da questo thread prima di scoprire il vero problema. :)
login_not_failed

SEI FANTASTICO. In GSUTIL, il mio rsync non funzionava proprio a causa di questo problema. Risolto il problema con LC_ALL e tutto funzionava bene come vino. <3 GRAZIE <3
dsignr il

27

Per me, ciò che ha funzionato è stato:

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

Spero che questo aiuti qualcuno.


25

In realtà ho scoperto che nella maggior parte dei miei casi, eliminare i personaggi è molto più semplice:

s = mystring.decode('ascii', 'ignore')

26
"Perfettamente" di solito non è ciò che esegue. Butta via cose che dovresti capire come affrontare correttamente.
Tripleee,

7
eliminare semplicemente "quei" caratteri (non inglesi) non è la soluzione poiché Python deve supportare tutte le lingue, non credi?
alemol,

8
Downvoted. Questa non è affatto la soluzione corretta. Scopri come lavorare con Unicode: joelonsoftware.com/articles/Unicode.html
Andrew Ferrier

4
Guarda, il modo più giudizioso di presentare questa particolare risposta è in questo modo: riconoscere che ASCII conferisce un certo privilegio a determinate lingue e utenti - questo è il tratteggio di fuga che può essere sfruttato per quegli utenti che potrebbero hackerare un corsivo, primo passaggio , script insieme potenzialmente per il lavoro preliminare prima dell'implementazione del supporto unicode completo.
lol

5
Se sto scrivendo uno script che deve solo stampare il testo inglese su stdout in un'applicazione interna dell'azienda, voglio solo che il problema scompaia. Basta che funzioni.
kagronick,

25

Il problema è che stai provando a stampare un carattere unicode, ma il tuo terminale non lo supporta.

Puoi provare a installare il language-pack-enpacchetto per risolvere il problema:

sudo apt-get install language-pack-en

che fornisce aggiornamenti dei dati di traduzione in inglese per tutti i pacchetti supportati (incluso Python). Installare un pacchetto di lingue diverse se necessario (a seconda dei caratteri che si sta tentando di stampare).

Su alcune distribuzioni Linux è necessario per assicurarsi che le impostazioni locali inglesi predefinite siano configurate correttamente (quindi i caratteri unicode possono essere gestiti da shell / terminale). A volte è più facile installarlo, che configurarlo manualmente.

Quindi, quando si scrive il codice, assicurarsi di utilizzare la codifica corretta nel codice.

Per esempio:

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

Se il problema persiste, ricontrolla la configurazione del sistema, ad esempio:

  • Il tuo file locale ( /etc/default/locale), che dovrebbe avere ad es

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

    o:

    LC_ALL=C.UTF-8
    LANG=C.UTF-8
  • Valore di LANG/ LC_CTYPEin shell.

  • Controlla le impostazioni locali supportate dalla shell:

    locale -a | grep "UTF-8"

Dimostrazione del problema e della soluzione nella VM nuova.

  1. Inizializzazione e provisioning della macchina virtuale (ad es. Utilizzo vagrant):

    vagrant init ubuntu/trusty64; vagrant up; vagrant ssh

    Vedi: scatole Ubuntu disponibili . .

  2. Stampa di caratteri unicode (come un segno di marchio simile ):

    $ 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. Ora installando 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. Ora il problema dovrebbe essere risolto:

    $ python -c 'print(u"\u2122");'
    
  5. Altrimenti, prova il seguente comando:

    $ LC_ALL=C.UTF-8 python -c 'print(u"\u2122");'
    

1
Cosa language-pack-enc'entra Python o questa domanda? AFAIK, può fornire traduzioni linguistiche dei messaggi ma non ha nulla a che fare con la codifica
Alastair McCormack,

2
Su alcune distribuzioni Linux è necessario per assicurarsi che le impostazioni locali inglesi predefinite siano configurate correttamente, specialmente quando si esegue lo script Python sul Terminale. Ha funzionato per me ad un certo punto. Vedi: codifica dei caratteri
kenorb il

Ah ok. Vuoi dire se vuoi usare un locale non inglese? Immagino che l'utente dovrà anche modificare /etc/locale.genper assicurarsi che la propria localizzazione sia costruita prima di usarla?
Alastair McCormack,

1
@AlastairMcCormack Commentato LANGda /etc/default/locale(in quanto non /etc/locale.genesiste) ed eseguito locale-gen, ma non ha aiutato. Non sono sicuro di cosa language-pack-enfaccia esattamente, poiché non ho trovato molta documentazione e elencarne il contenuto non aiuta molto.
Kenorb,

1
è improbabile che non ci siano già localizzazioni utf-8 su un sistema desktop, cioè è probabile che non sia necessario installare nulla, basta configurare LANG/ LC_CTYPE/ LC_ALLinvece (es LANG=C.UTF-8.).
jfs

19

Nel guscio:

  1. Trova le impostazioni internazionali UTF-8 supportate con il comando seguente:

    locale -a | grep "UTF-8"
  2. Esportalo prima di eseguire lo script, ad esempio:

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

    o manualmente come:

    export LC_ALL=C.UTF-8
  3. Provalo stampando un carattere speciale, ad es . :

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

Sopra testato su Ubuntu.


Sì, questa è la migliore risposta breve, non possiamo modificare il codice sorgente per usare .encode
Luat Nguyen - Neo.Mxn0

16

Aggiungi la riga in basso all'inizio dello script (o come seconda riga):

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

Questa è la definizione della codifica del codice sorgente di Python. Maggiori informazioni in PEP 263 .


2
Questo non risolve il problema quando il testo elaborato caricato da un file esterno contiene codifiche utf-8. Questo aiuta solo per i letterali scritti nello stesso script python stesso ed è solo un indizio per l'interprete python, ma non ha alcun impatto sull'elaborazione del testo.
Mikaelblomkvistsson

16

Ecco un riassunto di alcune altre cosiddette risposte "poliziotto". Ci sono situazioni in cui semplicemente buttare via i fastidiosi personaggi / stringhe è una buona soluzione, nonostante le proteste espresse qui.

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

Testandolo:

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

risultati:

1
test
98°
98

Suggerimento: potresti voler chiamare questa funzione toAsciiinvece? Questa è una questione di preferenza.

Questo è stato scritto per Python 2. Per Python 3, credo che vorrai usare bytes(obj,"ascii")piuttosto che str(obj). Non l'ho ancora testato, ma ad un certo punto rivedrò la risposta.


8

Inserisco sempre il codice di seguito nelle prime due righe dei file Python:

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

6

Semplici funzioni di aiuto trovate qui .

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

Per ottenere il sfuggito bytestring (per convertire arbitraria stringa Unicode a byte che utilizzano la codifica ASCII), si potrebbe usare backslashreplacegestore di errore: u'\xa0'.encode('ascii', 'backslashreplace'). Anche se dovresti evitare tale rappresentazione e configurare il tuo ambiente per accettare caratteri non ascii - è il 2016!
jfs

Felice Anno Nuovo @JFSebastian. Sono rimasto frustrato dal problema Python-Unicode e alla fine ho ottenuto questa soluzione che funzionava. Non lo sapevo. Comunque grazie per il suggerimento.
Parag Tyagi,



3

Ho appena usato il seguente:

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

Controlla cosa dice la documentazione al riguardo:

unicodedata.normalize (form, unistr) Restituisce il modulo normale per la stringa Unicode unistr. I valori validi per il modulo sono 'NFC', 'NFKC', 'NFD' e 'NFKD'.

Lo standard Unicode definisce varie forme di normalizzazione di una stringa Unicode, in base alla definizione di equivalenza canonica e di equivalenza di compatibilità. In Unicode, diversi caratteri possono essere espressi in vari modi. Ad esempio, il carattere U + 00C7 (LETTERA MAIALE LATINA C CON CEDILLA) può anche essere espresso come sequenza U + 0043 (LETTERA MAIALE LATINA C) U + 0327 (COMBINAZIONE DI CEDILLA).

Per ogni personaggio esistono due forme normali: la forma normale C e la forma normale D. La forma normale D (NFD) è anche nota come decomposizione canonica e traduce ogni carattere nella sua forma decomposta. La forma normale C (NFC) applica prima una decomposizione canonica, quindi compone nuovamente caratteri pre-combinati.

Oltre a queste due forme, esistono due forme normali aggiuntive basate sull'equivalenza di compatibilità. In Unicode sono supportati alcuni caratteri che normalmente sarebbero unificati con altri caratteri. Ad esempio, U + 2160 (ROMAN NUMERAL ONE) è davvero la stessa cosa di U + 0049 (LATIN CAPITAL LETTER I). Tuttavia, è supportato in Unicode per la compatibilità con set di caratteri esistenti (ad esempio gb2312).

La forma normale KD (NFKD) applicherà la decomposizione di compatibilità, ovvero sostituirà tutti i caratteri di compatibilità con i loro equivalenti. La forma normale KC (NFKC) applica prima la decomposizione di compatibilità, seguita dalla composizione canonica.

Anche se due stringhe unicode sono normalizzate e sembrano uguali a un lettore umano, se una ha la combinazione di caratteri e l'altra no, potrebbero non essere uguali.

Risolve per me. Semplice e facile.


3

Di seguito la soluzione ha funzionato per me, appena aggiunto

u "String"

(che rappresenta la stringa come unicode) prima della mia stringa.

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)

3

Purtroppo questo funziona in Python 3 almeno ...

Python 3

A volte l'errore si trova nelle variabili di ambiente e la circonda così

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

dove gli errori vengono ignorati nella codifica.


2

Ho appena avuto questo problema e Google mi ha portato qui, quindi solo per aggiungere alle soluzioni generali qui, questo è ciò che ha funzionato per me:

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

Ho avuto questa idea dopo aver letto la presentazione di Ned .

Tuttavia, non pretendo di comprendere appieno il motivo per cui funziona. Quindi, se qualcuno può modificare questa risposta o inserire un commento per spiegare, lo apprezzerò.


3
Qual è il typevalore? prima e dopo questo? Penso che il motivo per unic += valuecui funzioni sia che facendo lo stesso che unic = unic + valuesi sta aggiungendo una stringa e un unicode, dove python assume quindi unicode per il risultante, unicovvero il tipo più preciso (pensate a quando lo fate a = float(1) + int(1), adiventa un float) e quindi value = unicpunta valueal nuovo unicoggetto che risulta essere unicode.
Tom Myddeltyn,

2

Abbiamo riscontrato questo errore durante l'esecuzione manage.py migrate in Django con dispositivi localizzati.

La nostra fonte conteneva la # -*- coding: utf-8 -*-dichiarazione, MySQL era correttamente configurato per utf8 e Ubuntu aveva il language pack e i valori appropriati/etc/default/locale .

Il problema era semplicemente che il contenitore Django (che usiamo docker) mancava di LANGenv var.

Impostazione LANGper en_US.UTF-8e riavviando il contenitore prima di rieseguire migrazioni risolto il problema.


1

Molte risposte qui (ad esempio @agf e @Andbdrew) hanno già affrontato gli aspetti più immediati della domanda di PO.

Tuttavia, penso che ci sia un aspetto sottile ma importante che è stato in gran parte ignorato e che conta molto per tutti coloro che come me sono finiti qui mentre cercavano di dare un senso alle codifiche in Python: la gestione della rappresentazione dei personaggi in Python 2 vs Python 3 è selvaggiamente diversa . Sento che una grande confusione là fuori ha a che fare con le persone che leggono delle codifiche in Python senza essere consapevoli della versione.

Suggerisco a chiunque sia interessato a comprendere la causa principale del problema OP, leggendo l' introduzione di Spolsky alle rappresentazioni dei personaggi e Unicode e poi spostandosi su Batchelder su Unicode in Python 2 e Python 3.


sì, il mio errore era su python 2.7, 'a'.format (u'ñ'), e la soluzione corretta non è usare .encode ('utf-8') ma usare sempre stringhe unicode, (il default in python 3 ): u'a'.format (u'ñ '),
Rogelio

1

Cerca di evitare la conversione di variabile in str (variabile). A volte, potrebbe causare il problema.

Suggerimento semplice da evitare:

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

L'esempio sopra risolverà anche l'errore Encode.


questo non funziona perché si verifica un errore
nell'eccezione

0

Se hai qualcosa del genere, packet_data = "This is data"fallo nella riga successiva, subito dopo l'inizializzazione packet_data:

unic = u''
packet_data = unic


0

Ho avuto questo problema provando a generare caratteri Unicode stdout, ma con sys.stdout.write, piuttosto che con la stampa (in modo da poter supportare anche l'output su un altro file).

Dalla documentazione di BeautifulSoup , ho risolto questo problema con la libreria di codec:

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)

0

Questo problema si verifica spesso quando un progetto django viene distribuito utilizzando Apache. Perché Apache imposta la variabile di ambiente LANG = C in / etc / sysconfig / httpd. Basta aprire il file e commentare (o cambiare il tuo sapore) questa impostazione. Oppure usa l'opzione lang del comando WSGIDaemonProcess, in questo caso sarai in grado di impostare diverse variabili d'ambiente LANG su host virtuali diversi.


0

La soluzione raccomandata non ha funzionato per me, e potrei vivere scaricando tutti i caratteri non ascii, quindi

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

che mi ha lasciato con qualcosa di spogliato che non genera errori.


0

Questo funzionerà:

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

Produzione:

>>>bats
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.