2010-03-25 5 views
14

Sto lavorando al progetto di lettore RSS Django here.La codifica indica che il codec "ascii" non può codificare il carattere ... ordinale non compreso nell'intervallo (128) "

Il feed RSS leggerà qualcosa come "OKLAHOMA CITY (AP) - James Harden let". La codifica del feed RSS legge encoding = "UTF-8", quindi credo di passare utf-8 al markdown nel frammento di codice qui sotto. Il cruscotto è dove soffoca.

Ottengo l'errore Django del codec "ascii" non è in grado di codificare il carattere u '\ u2014' nella posizione 109: ordinale non nell'intervallo (128) "che è un UnicodeEncodeError. Nelle variabili che vengono passate vedo "OKLAHOMA CITY (AP) \ u00262 James Harden". La riga di codice che non funziona è:

content = content.encode(parsed_feed.encoding, "xmlcharrefreplace") 

Sto usando Markdown 2.0, 1.1 Django e Python 2.4.

Qual è la sequenza magica di codifica e decodifica che devo fare per farlo funzionare?


(In risposta alla richiesta di Prometeo. Sono d'accordo la formattazione aiuta)

Quindi, in vista ho aggiungere una linea smart_unicode al di sopra della linea di codifica parsed_feed ...

content = smart_unicode(content, encoding='utf-8', strings_only=False, errors='strict') 
content = content = content.encode(parsed_feed.encoding, "xmlcharrefreplace") 

Questo spinge il problema al mio models.py per me dove ho

def save(self, force_insert=False, force_update=False): 
    if self.excerpt: 
     self.excerpt_html = markdown(self.excerpt) 
     # super save after this 

Se cambio il metodo di salvataggio in modo da avere. ..

def save(self, force_insert=False, force_update=False): 
    if self.excerpt: 
     encoded_excerpt_html = (self.excerpt).encode('utf-8') 
     self.excerpt_html = markdown(encoded_excerpt_html) 

ottengo l'errore "codec 'ascii' non può decodificare byte 0xE2 in posizione 141: non ordinale gamma (128)" perché ora si legge "\ xe2 \ x80 \ x94" dove la lineetta era

+0

la prego di inviare il traceback così com'è? – tzot

+0

Fondamentalmente, qual è il valore di 'parsed_feed.encoding'? E '' ascii ', per caso? (questo spiegherebbe entrambi i tuoi errori). – tzot

risposta

4
+1

utilizzando ... content = smart_unicode (contenuti, encoding = 'utf-8', strings_only = False, 'rigorosa' errori =) content = contenuto = content.encode (parsed_feed.encoding, "xmlcharrefreplace") spinte il problema al mio models.py per me dove ho def save (self, force_insert = False, force_update = False): se self.excerpt: self.excerpt_html = markdown (self.excerpt) # super save dopo questo Se cambiare il metodo di salvataggio di avere encoded_excerpt_html = (self.excerpt) .encode ('utf-8') self.excerpt_html = markdown (encoded_excerpt_html) – user140314

+0

Parte 2: ottengo l'errore " 'ascii' il codec non può decodificare il byte 0xe2 nella posizione 141: ordinale non nel range (128) "perché ora legge" \ xe2 \ x80 \ x94 "dove si trovava il trattino. – user140314

+0

Potresti modificare il tuo post originale con quanto sopra? È molto difficile da leggere senza una formattazione corretta. – nikola

12

Se il dato che si sta ricevendo è, infatti, codificato in UTF-8, dovrebbe essere una sequenza di byte - un oggetto "str" ​​Python, in Python 2.X

È possibile verificare questo con un'affermazione:

assert isinstance(content, str) 

Una volta che sai che è vero, puoi passare alla codifica attuale. Python non esegue la transcodifica, ad esempio direttamente da UTF-8 ad ASCII. È necessario attivare prima la sequenza di byte in una stringa Unicode, decodificando esso:

unicode_content = content.decode('utf-8') 

(se ci si può fidare parsed_feed.encoding, quindi utilizzare che al posto del 'utf-8' senso letterale entrambi i casi,. essere preparato per gli errori.)

È quindi possibile prendere quella stringa e codificare in ASCII, sostituendo i caratteri di altezza con i loro equivalenti entità XML:

xml_content = unicode_content.encode('ascii', 'xmlcharrefreplace') 

Il metodo completo, quindi, starebbe somthing come questo:

try: 
    content = content.decode(parsed_feed.encoding).encode('ascii', 'xmlcharrefreplace') 
except UnicodeDecodeError: 
    # Couldn't decode the incoming string -- possibly not encoded in utf-8 
    # Do something here to report the error 
0

Ho riscontrato questo errore durante la scrittura di un nome file con file zip. Quanto segue non è riuscito

ZipFile.write(root+'/%s'%file, newRoot + '/%s'%file) 

e la seguente lavorato

ZipFile.write(str(root+'/%s'%file), str(newRoot + '/%s'%file)) 
+3

Chiamare 'str()' su un valore unicode con caratteri non ASCII darebbe lo stesso identico errore che l'OP sta vedendo. –

+0

@MartijnPieters: Ciao, questo è un punto molto importante che tu fai. Non riesco a trovare alcun riferimento a ciò che 'str()' sta effettivamente facendo in [il fine manuale] (http://docs.python.org/2/library/functions.html#str) tuttavia attribuisco che io sia un Python noob più che un difetto del manuale. Dove è documentato questo, che cosa esattamente 'str() sta facendo all'argomento, e cosa restituisce' str() '? Grazie! – dotancohen

+0

'str()' restituisce una * stringa di byte *; caratteri con valori compresi tra 0 e 255, con 0-127 solitamente interpretati e visualizzati come caratteri ASCII. Un valore 'unicode()', d'altra parte, può rappresentare qualsiasi punto di codice nello standard Unicode, tra 0 e 1114111. Quindi usare 'str (unicodevalue)' per trasformare unicode in una stringa di byte sta per coinvolgere * qualche * trasformazione . –

Problemi correlati