2009-11-19 17 views
7

ottengo questo errore:Python, UnicodeDecodeError

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe0 in position 4: ordinal not in range(128) 

Ho provato a installare molti codec differenti (nell'intestazione, come # -*- coding: utf8 -*-), o anche utilizzando u "string", ma sembra ancora.

Come posso risolvere questo problema?

Edit: Io non so il carattere reale che sta causando questo, ma dal momento che questo è un programma che esplora in modo ricorsivo cartelle, deve essere trovato un file con i caratteri strani nel suo nome

Codice:

# -*- coding: utf8 -*- 


# by TerabyteST 

########################### 

# Explores given path recursively 
# and finds file which size is bigger than the set treshold 

import sys 
import os 

class Explore(): 
    def __init__(self): 
     self._filelist = [] 

    def exploreRec(self, folder, treshold): 
     print folder 
     generator = os.walk(folder + "/") 
     try: 
      content = generator.next() 
     except: 
      return 
     folders = content[1] 
     files = content[2] 
     for n in folders: 
      if "$" in n: 
       folders.remove(n) 
     for f in folders: 
      self.exploreRec(u"%s/%s"%(folder, f), treshold) 
     for f in files: 
      try: 
       rawsize = os.path.getsize(u"%s/%s"%(folder, f)) 
      except: 
       print "Error reading file %s"%u"%s/%s"%(folder, f) 
       continue 
      mbsize = rawsize/(1024 * 1024.0) 
      if mbsize >= treshold: 
       print "File %s is %d MBs!"%(u"%s/%s"%(folder, f), mbsize) 

Errore:

Traceback (most recent call last): 
    File "<pyshell#19>", line 1, in <module> 
    a.exploreRec("C:", 100) 
    File "D:/Python/Explorator/shitfinder.py", line 35, in exploreRec 
    print "Error reading file %s"%u"%s/%s"%(folder, f) 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe0 in position 4: ordinal not in range(128) 

Ecco ciò che viene mostrato usando print repr("Error reading file %s"%u"%s/%s"%(folder.decode('utf-8','ignore'), f.decode('utf-8','ignore')))

>>> a = Explore() 
>>> a.exploreRec("C:", 100) 
File C:/Program Files/Ableton/Live 8.0.4/Resources/DefaultPackages/Live8Library_v8.2.alp is 258 MBs! 
File C:/Program Files/Adobe/Reader 9.0/Setup Files/{AC76BA86-7AD7-1040-7B44-A90000000001}/Data1.cab is 114 MBs! 
File C:/Program Files/Microsoft Games/Age of Empires III/art/Art1.bar is 393 MBs! 
File C:/Program Files/Microsoft Games/Age of Empires III/art/art2.bar is 396 MBs! 
File C:/Program Files/Microsoft Games/Age of Empires III/art/art3.bar is 228 MBs! 
File C:/Program Files/Microsoft Games/Age of Empires III/Sound/Sound.bar is 273 MBs! 
File C:/ProgramData/Microsoft/Search/Data/Applications/Windows/Windows.edb is 162 MBs! 
REPR: 
u"Error reading file C:/ProgramData/Microsoft/Windows/GameExplorer/{1B4801C1-CA86-487E-8347-B26F1CCB2F75}/SupportTasks/0/Sito web di Mirror's Edge.lnk" 
END REPR: 
Error reading file C:/ProgramData/Microsoft/Windows/GameExplorer/{1B4801C1-CA86-487E-8347-B26F1CCB2F75}/SupportTasks/0/Sito web di Mirror's Edge.lnk 
REPR: 
u"Error reading file C:/ProgramData/Microsoft/Windows/GameExplorer/{1B4801C1-CA86-487E-8347-B26F1CCB2F75}/SupportTasks/1/Contenuti scaricabili di Mirror's Edge.lnk" 
END REPR: 
Error reading file C:/ProgramData/Microsoft/Windows/GameExplorer/{1B4801C1-CA86-487E-8347-B26F1CCB2F75}/SupportTasks/1/Contenuti scaricabili di Mirror's Edge.lnk 
REPR: 
u'Error reading file C:/ProgramData/Microsoft/Windows/Start Menu/Programs/Google Talk/Supporto/Modalitiagnostica di Google Talk.lnk' 
END REPR: 
Error reading file C:/ProgramData/Microsoft/Windows/Start Menu/Programs/Google Talk/Supporto/Modalitiagnostica di Google Talk.lnk 
REPR: 
u'Error reading file C:/ProgramData/Microsoft/Windows/Start Menu/Programs/Microsoft SQL Server 2008/Strumenti di configurazione/Segnalazione errori e utilizzo funzionaliti SQL Server.lnk' 
END REPR: 
Error reading file C:/ProgramData/Microsoft/Windows/Start Menu/Programs/Microsoft SQL Server 2008/Strumenti di configurazione/Segnalazione errori e utilizzo funzionaliti SQL Server.lnk 
REPR: 
u'Error reading file C:/ProgramData/Microsoft/Windows/Start Menu/Programs/Mozilla Firefox/Mozilla Firefox (Modalitrovvisoria).lnk' 
END REPR: 
Error reading file C:/ProgramData/Microsoft/Windows/Start Menu/Programs/Mozilla Firefox/Mozilla Firefox (Modalitrovvisoria).lnk 
REPR: 
u'Error reading file C:/ProgramData/Microsoft/Windows/Start Menu/Programs/Mozilla Firefox 3.6 Beta 1/Mozilla Firefox 3.6 Beta 1 (Modalitrovvisoria).lnk' 
END REPR: 
Error reading file C:/ProgramData/Microsoft/Windows/Start Menu/Programs/Mozilla Firefox 3.6 Beta 1/Mozilla Firefox 3.6 Beta 1 (Modalitrovvisoria).lnk 

Traceback (most recent call last): 
    File "<pyshell#21>", line 1, in <module> 
    a.exploreRec("C:", 100) 
    File "D:/Python/Explorator/shitfinder.py", line 30, in exploreRec 
    self.exploreRec(("%s/%s"%(folder, f)).encode("utf-8"), treshold) 
    File "D:/Python/Explorator/shitfinder.py", line 30, in exploreRec 
    self.exploreRec(("%s/%s"%(folder, f)).encode("utf-8"), treshold) 
    File "D:/Python/Explorator/shitfinder.py", line 30, in exploreRec 
    self.exploreRec(("%s/%s"%(folder, f)).encode("utf-8"), treshold) 
    File "D:/Python/Explorator/shitfinder.py", line 30, in exploreRec 
    self.exploreRec(("%s/%s"%(folder, f)).encode("utf-8"), treshold) 
    File "D:/Python/Explorator/shitfinder.py", line 30, in exploreRec 
    self.exploreRec(("%s/%s"%(folder, f)).encode("utf-8"), treshold) 
    File "D:/Python/Explorator/shitfinder.py", line 30, in exploreRec 
    self.exploreRec(("%s/%s"%(folder, f)).encode("utf-8"), treshold) 
UnicodeDecodeError: 'ascii' codec can't decode byte 0x99 in position 78: ordinal not in range(128) 
>>> 
+3

Nessun codice, nessun aiuto! –

+0

Anche un traceback completo sarebbe d'aiuto. – retracile

+0

@John: non completamente vero. Il commento "coding: utf-8" all'inizio determina quale codifica del file di origine Python si aspetta. –

risposta

13

Non possiamo indovinare che cosa si sta cercando di fare, e non ciò che è nel codice, non quello "impostazione molti diversi codecs "significa, né cosa si deve fare per" string ".

Si prega di cambiare il codice al suo stato iniziale in modo che rifletta nel modo migliore possibile ciò che si sta tentando di fare, eseguirlo di nuovo, e quindi modificare la domanda per fornire (1) il traceback completo e il messaggio di errore che si ottiene (2) snippet che include l'ultima istruzione nel tuo script che appare nel traceback (3) una breve descrizione di cosa vuoi fare il codice (4) quale versione di Python stai usando.

Modifica dopo i dettagli aggiunti alla domanda:

(0) Proviamo alcune trasformazioni sulla dichiarazione in mancanza:

originale:
print "Error reading file %s"%u"%s/%s"%(folder, f)
aggiungere spazi per illeggibilità ridotta:
print "Error reading file %s" % u"%s/%s" % (folder, f)
Aggiungi parentesi per enfatizzare l'ordine di valutazione:
print ("Error reading file %s" % u"%s/%s") % (folder, f)
valutare l'espressione (costante) tra parentesi:
print u"Error reading file %s/%s" % (folder, f)

'davvero questo che si intende? Suggerimento: costruisci il percorso UNA VOLTA, usando un metodo migliore (vedi punto (2) sotto).

(1) In generale, utilizzare repr(foo) o "%r" % foo per la diagnostica. In questo modo, il tuo codice diagnostico è molto meno probabile che causi un'eccezione (come sta accadendo qui) E tu eviti l'ambiguità. Inserire la dichiarazione print repr(folder), repr(f) prima di provare a ottenere le dimensioni, eseguire nuovamente e riportare.

(2) Non fare percorsi da u"%s/%s" % (folder, filename) ... utilizzare os.path.join(folder, filename)

(3) Non hanno excepts nude, verificare la presenza di problemi noti. In modo che i problemi sconosciuti non rimangono sconosciute, fare qualcosa di simile:

try: 
    some_code() 
except ReasonForBaleOutError: 
    continue 
except: 
    # something's gone wrong, so get diagnostic info 
    print repr(interesting_datum_1), repr(interesting_datum_2) 
    # ... and get traceback and error message 
    raise 

Un modo più sofisticato prevede l'accesso al posto di stampa, ma quanto sopra è molto meglio di non sapere cosa sta succedendo.

ulteriori modifiche dopo la versione RTM ("os.walk"), ricordando vecchie leggende, e rileggendo il tuo codice:

(4) os.walk() si avvicina tutto l'albero; non è necessario chiamarlo in modo ricorsivo.

(5) Se si passa una stringa unicode a os.walk(), i risultati (percorsi, nomi di file) vengono riportati come unicode. Non hai bisogno di tutta quella roba "blah". Quindi devi solo scegliere come visualizzare i risultati Unicode.

(6) Rimozione di percorsi con "$" in essi: è necessario modificare l'elenco in loco ma il metodo è pericoloso. Prova qualcosa del genere:

for i in xrange(len(folders), -1, -1): 
    if '$' in folders[i]: 
     del folders[i] 

(7) Si riferisce ai file unendo un nome di cartella e un nome di file. Stai usando il nome della cartella ORIGINALE; quando strappi la ricorsione, questo non funzionerà; è necessario utilizzare il valore content[0] attualmente scartato segnalato da os.walk.

(8) Si dovrebbe trovare ad usare qualcosa di molto semplice come:

for folder, subfolders, filenames in os.walk(unicoded_top_folder): 

Non c'è bisogno di generator = os.walk(...); try: content = generator.next() ecc e BTW se mai hai bisogno di fare generator.next() in futuro, utilizzare except StopIteration invece di una nuda ad eccezione .

(9) Se il chiamante fornisce una cartella inesistente, non viene sollevata alcuna eccezione, ma non fa nulla. Se la cartella fornita esiste ma è vuota, idem. Se è necessario distinguere tra questi due scenari, è necessario eseguire test aggiuntivi.

Risposta a questo commento OP: "" "Grazie, per favore leggi le informazioni repr() ha mostrato nel primo post. Non so perché ha stampato così tanti articoli diversi, ma sembra hanno tutti problemi. E la cosa comune tra tutti loro sono i file .ink. Può essere questo il problema? Inoltre, negli ultimi, quelli firefox, stampa (Modalitrovvisoria) mentre il vero nome del file da Explorer contiene (Modalità provvisoria) "" "

(10) Umm che non è" .INK ".lower(), è" .LNK ".lower() ... forse è necessario cambiare il carattere in qualunque cosa tu sia leggendolo con.

(11) Il fatto che il nome del file "problema" finisca tutto in ".lnk"/potrebbe/essere qualcosa che deve fare con os.walk() e/o Windows fare qualcosa di speciale con i nomi di quei file.

(12) Ripeto qui la dichiarazione di Python che si è utilizzato per tale produzione, con qualche spazio vuoto introdotto:

print repr(
    "Error reading file %s" \ 
    % u"%s/%s" % (
     folder.decode('utf-8','ignore'), 
     f.decode('utf-8','ignore') 
     ) 
    ) 

Sembra che non avete letto, o non capito, o semplicemente ignorato, il consiglio che ti ho dato in un commento su un'altra risposta (e la risposta di questo rispondente): UTF-8 NON è rilevante nel contesto dei nomi di file in un file system Windows.

Siamo interessati esattamente a quale cartella e f si riferiscono. Hai calpestato tutte le prove tentando di decodificarlo utilizzando UTF-8. Hai aggravato l'offuscamento usando l'opzione "ignora". Se avessi usato l'opzione "Sostituisci", avresti visto "(Modalit \ ufffdrovvisoria)". L'opzione "ignora" non ha posto nel debug.

In ogni caso, il fatto che alcuni nomi di file avessero qualche tipo di errore, ma sembrava NON perdere i caratteri con l'opzione "ignora" (o sembrava NON essere manomesso) è sospetto.

Quale parte di "" "Inserisci la frase print repr(folder), repr(f)" "" non hai capito?Tutto quello che dovete fare è qualcosa di simile:

print "Some meaningful text" # "error reading file" isn't 
print "folder:", repr(folder) 
print "f:", repr(f) 

(13) Risulta inoltre che avete introdotto UTF-8 altrove nel codice, a giudicare dal traceback: self.exploreRec(("%s/%s"%(folder, f)).encode("utf-8"), treshold)

Vorrei fai notare che non sai ancora se la cartella ef si riferiscono a oggetti str o oggetti unicode, e due risposte hanno suggerito che sono molto probabilmente degli str oggetti, quindi perché introdurre blahbah.encode() ??

Un punto più generale: cerca di capire quale sia il tuo problema/i problemi, PRIMA di cambiare lo script. Il tentativo di provare ogni suggerimento associato a una tecnica di debug efficace quasi zero non è la strada da seguire.

(14) Quando si esegue nuovamente lo script, è possibile ridurre il volume dell'output eseguendolo su alcuni sottoinsiemi di C: \ ... soprattutto se si procede con il mio suggerimento originale per eseguire la stampa di debug di TUTTI i nomi di file, non solo quelli errati (sapere come appaiono quelli non di errore potrebbe aiutare a capire il problema).

risposta a Bryan McLemore di "ripulire" la funzione:

(15) Ecco una sessione interattiva con annotazioni che illustra ciò che effettivamente accade con os.walk() e nomi di file non-ASCII:

C:\junk\terabytest>dir 
[snip] 
Directory of C:\junk\terabytest 

20/11/2009 01:28 PM <DIR>   . 
20/11/2009 01:28 PM <DIR>   .. 
20/11/2009 11:48 AM <DIR>   empty 
20/11/2009 01:26 PM    11 Hašek.txt 
20/11/2009 01:31 PM    1,419 tbyte1.py 
29/12/2007 09:33 AM     9 Ð.txt 
       3 File(s)   1,439 bytes 
[snip] 

C:\junk\terabytest>\python26\python 
Python 2.6.4 (r264:75708, Oct 26 2009, 08:23:19) [MSC v.1500 32 bit (Intel)] onwin32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> from pprint import pprint as pp 
>>> import os 

os.walk (UNICODE_STRING) -> risultati in unicode oggetti

>>> pp(list(os.walk(ur"c:\junk\terabytest"))) 
[(u'c:\\junk\\terabytest', 
    [u'empty'], 
    [u'Ha\u0161ek.txt', u'tbyte1.py', u'\xd0.txt']), 
(u'c:\\junk\\terabytest\\empty', [], [])] 

os.walk (str_string) -> risultati in s tr oggetti

>>> pp(list(os.walk(r"c:\junk\terabytest"))) 
[('c:\\junk\\terabytest', 
    ['empty'], 
    ['Ha\x9aek.txt', 'tbyte1.py', '\xd0.txt']), 
('c:\\junk\\terabytest\\empty', [], [])] 

CP1252 è la codifica mi aspetto per essere utilizzato sul mio sistema ...

>>> u'\u0161'.encode('cp1252') 
'\x9a' 
>>> 'Ha\x9aek'.decode('cp1252') 
u'Ha\u0161ek' 

decodifica del str con UTF-8 non funziona, come previsto

>>> 'Ha\x9aek'.decode('utf8') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "C:\python26\lib\encodings\utf_8.py", line 16, in decode 
    return codecs.utf_8_decode(input, errors, True) 
UnicodeDecodeError: 'utf8' codec can't decode byte 0x9a in position 2: unexpected code byte 

stringa QUALSIASI casuale di byte possono essere decodificati senza errori usando latin1

>>> 'Ha\x9aek'.decode('latin1') 
u'Ha\x9aek' 

MA U + 009A è un carattere di controllo (SINGLE CHARACTER INTRODUCER), cioè senza senso senza senso; assolutamente niente a che fare con la risposta corretta

>>> unicodedata.name(u'\u0161') 
'LATIN SMALL LETTER S WITH CARON' 
>>> 

(16) Questo esempio mostra cosa accade quando il carattere è rappresentabile nel set di caratteri di default; cosa succede se non lo è? Ecco un esempio (usando IDLE questa volta) di un nome di file che contiene ideogrammi CJK, che sicuramente non sono rappresentabili nel mio set di caratteri predefinito:

IDLE 2.6.4  
>>> import os 
>>> from pprint import pprint as pp 

repr (risultati Unicode) guarda bene

>>> pp(list(os.walk(ur"c:\junk\terabytest\chinese"))) 
[(u'c:\\junk\\terabytest\\chinese', [], [u'nihao\u4f60\u597d.txt'])] 

e l'unicode viene visualizzato correttamente in IDLE:

>>> print list(os.walk(ur"c:\junk\terabytest\chinese"))[0][2][0] 
nihao你好.txt 

Il risultato di str è evidentemente generato utilizzando.codifica (qualunque cosa, "sostituisci") - non molto utile per es. non è possibile aprire il file passandolo come nome del file.

>>> pp(list(os.walk(r"c:\junk\terabytest\chinese"))) 
[('c:\\junk\\terabytest\\chinese', [], ['nihao??.txt'])] 

Quindi la conclusione è che per ottenere i migliori risultati, si dovrebbe passare una stringa unicode per os.walk(), e affrontare eventuali problemi di visualizzazione.

+0

fatto, come è ora? –

+0

il problema è che l'eccezione si verifica nell'eccezione, molto probabilmente perché la codifica all'interno del tentativo genera la stessa eccezione, e non so come ottenere ulteriori informazioni su di esso (come il carattere che sta causando questo o dove è il file/cartella menzionati situato sul mio disco fisso) –

+0

@terabytest: "non so come ottenere ulteriori informazioni" ?? Hai letto la mia risposta modificata in particolare le parti (1) e (3) dove menziona la funzione 'repr()'? –

1

Si sta eseguendo questo programma in una finestra di cmd.exe di Windows? Se è così, prova a eseguirlo in IDLE e verifica se ricevi gli stessi errori. La casella Cmd.exe non esegue Unicode, solo ASCII.

+0

lo sto eseguendo in IDLE –

2

Si sta tentando di eseguire un'azione (ad es., Stampare) su una stringa unicode che contiene caratteri non ASCII e la stringa viene convertita in ascii per impostazione predefinita. È necessario specificare la codifica per rappresentare correttamente la stringa.
Sarebbe di grande aiuto, se pubblichi qualche esempio di codice di ciò che stai cercando di fare.

Il modo più semplice per fare questo sarebbe:
s = u'ma\xf1ana';
print s.encode('latin-1');

A cura dopo i dettagli aggiunti alla domanda:

Nel tuo caso è necessario decodificare la stringa di leggere prima:
f.decode();,
quindi prova a cambiare
u"%s/%s" % (folder, f)
a
os.path.join(folder, f.decode())

nota, che codifica 'latin-1' potrebbe essere necessaria per cambiare ciò che il vostro file è denominato con

PS: John Machin ha menzionato modi molto utile per migliorare e ripulire il codice. +1

+0

sì, sto provando a stampare la stringa. Come faccio a dire di non usare ascii? –

+0

L'esempio più semplice sarebbe il seguente: s = u'ma \ xf1ana ';
stampa s.encode ('latin-1') – artdanil

+0

non può ottenere commenti per visualizzare correttamente l'esempio di codice, quindi l'ho inserito nella risposta. – artdanil

1
u"%s" % f 

In vari punti si sta facendo qualcosa di simile al codice precedente. Questo è esattamente il modo sbagliato di convertire un oggetto str in un oggetto unicode mentre la conversione viene eseguita usando sys.getdefaultencoding() (ascii), che è quasi sicuramente sbagliato.

Si dovrebbero usare i metodi di codifica/decodifica per convertire in/da un oggetto Unicode. Ciò richiede di sapere quale codifica del tuo input (le stringhe restituite da os.walk) lo è. Per esempio, se i file sono codificati in UTF-8

uf = f.decode('utf-8') 

interpreteranno f come UTF-8 sequenza codificata di byte e restituire l'oggetto unicode corretta. Allo stesso modo, quando hai bisogno di generare l'oggetto Unicode, lo converti nuovamente in uno str, specificando la codifica valida che vuoi esportare come.

print uf.encode('utf-8') 
+0

Ho ancora lo stesso errore UnicodeDecodeError: il codec 'ascii' non può decodificare il byte 0x99 in posizione 125: ordinale non compreso nell'intervallo (128) anche se ho scritto print "Errore lettura file% s"% ("% s /% s" % (cartella, f)). decode ("utf-8") ... Wth –

+0

L'argomento riguarda i percorsi dei file di Windows, quindi utf8 è rilevante quanto Latino1. –

+0

Il mio post era prima che aggiungesse quell'informazione e fosse inteso come informazione generica che spiega i problemi con l'approccio usato. Capire questi problemi aiuta, indipendentemente da quale sia la vera codifica utilizzata. Sfortunatamente, il mio post è stato preso al valore nominale invece che come descrizione generale. – jamessan

-1

invece di fare:

print "Error reading file %s"%u"%s/%s"%(folder, f) 

Prova questa:

print "Error reading file %s"%u"%s/%s"%(folder.encode('ascii','ignore'), f.encode('ascii','ignore')) 

Dal momento che la console non può stampare caratteri Unicode, è possibile di vedere il nome corretto. 'ignore' dice al codec di saltare quei caratteri. puoi anche usare 'replace' (stampa un '?'), 'xmlcharrefreplace' (sostituisce con & x #### del punto di codice), 'backslashreplace' (sostituisce con \ x ###### del codice)

Sarà necessario codificare ogni stringa Unicode come questa che si stampa.

+0

Sto ancora ricevendo questo UnicodeDecodeError: il codec 'ascii' non può decodificare il byte 0x99 in posizione 25: ordinale non nel range (128) è un mistero –

+0

hai codificato 'u' anche tu? Non ho notato che – Knio

+0

E l'utilizzo di "ignora" gli permetterà di vedere il "nome corretto" ??? –

0

Ho avuto la sfortuna di lavorare in alcune codebase che non erano coerenti con la loro codifica.

Questa è una funzione che abbiamo usato per aiutare a pulire in su:

def to_unicode(value): 
    if isinstance(value, unicode): 
     return value 
    elif isinstance(value, str): 
     try: 
      if value.startswith('\xff\xfe'): 
       return value.decode('utf-16-le') 
      elif value.startswith('\xfe\xff'): 
       return value.decode('utf-16-be') 
      else: 
       return value.decode('utf-8') 
     except UnicodeDecodeError: 
      return value.decode('latin-1') 
    else: 
     try: 
      return unicode(value) 
     except UnicodeError: 
      return to_unicode(str(value)) 
     except TypeError: 
      if hasattr(value, '__unicode__'): 
       return value.__unicode__() 

Quindi, utilizzando la funzione che è possibile utilizzare:

print u"Error reading file %s/%s" % (to_unicode(folder), to_unicode(f)) 
+0

Cosa ti fa pensare che i nomi delle directory e dei file restituiti da os.walk() su Windows non verranno codificati in modo coerente? Questi nomi non avranno BOM UTF-16, quindi il tuo codice proverà UTF8, che fallirà su qualsiasi byte non-ASCII, e in tal caso restituirà la stringa decodificata usando latin1, IOW totale spazzatura senza indicazione che c'è un problema! Vedere la mia risposta aggiornata per un esempio. –

+1

Se leggi più del blocco di codice vedresti che questa non era una funzione su misura per gestire questa domanda. È una funzione generale di to_unicode che avrei sperato di aiutarlo. Il tuo commento è tutt'altro che costruttivo e invece molto infiammatorio e molto inascoltato. –

+0

Ho visto che era una funzione generale to_unicode.Come ho spiegato, se l'oggetto str non è codificato in latin1 o UTF-8 e non inizia con un BOM UTF-16, la tua routine lo decodifica usando latin1, che NON è utile - perché LATIN1 DECODERÀ QUALSIASI SEQUENZA DI BYTES SENZA ERRORE, la tua routine sta nascondendo il problema. Vedere il mio esempio in cui la procedura prende uno str codificato in cp1252 e restituisce unicode contenente un carattere di controllo. Tali risultati sono spazzatura insignificante e bisogna dire che sono spazzatura priva di significato, sia per l'OP che per le proprie applicazioni. –

6

Python utilizza la codifica ASCII di default, che è fastidioso. Se si desidera cambiarlo in modo permanente, trovare e modificare il file site.py, cercare def setencoding() e alcune righe in basso modificano encoding = "ascii" in encoding = "utf-8". Ciao, ciao codifica ASCII predefinita.

Problemi correlati