Per qualche motivo, Python sembra avere problemi con BOM durante la lettura di stringhe Unicode da un file UTF-8. Considera quanto segue:Perché le stringhe Unicode di Python richiedono un trattamento speciale per BOM UTF-8?
with open('test.py') as f:
for line in f:
print unicode(line, 'utf-8')
Sembra semplice, non è vero?
Questo è quello che ho pensato fino a quando ho eseguito da linea di comando ed ho ottenuto:
UnicodeEncodeError: 'charmap' codec can't encode character u'\ufeff' in position 0: character maps to
<undefined>
Una breve visita a Google ha rivelato che BOM deve essere cancellato manualmente:
import codecs
with open('test.py') as f:
for line in f:
print unicode(line.replace(codecs.BOM_UTF8, ''), 'utf-8')
Questo funziona bene Comunque sto lottando per vedere qualche merito in questo.
Esiste una logica dietro al comportamento sopra descritto? Al contrario, UTF-16 funziona perfettamente.
Non può codificarlo perché U + FEFF è un noncharacter non valido. È perché i file UTF-8 * non dovrebbero * contenere un BOM in essi! Non sono né richiesti né raccomandati. L'endianità non ha senso con le unità di codice a 8 bit. Fanno fallire anche le cose, perché non puoi più fare semplicemente 'cat a b c> abc' se quei file hanno delle distinte estranee (leggi: * qualsiasi *) in esse. Gli stream UTF-8 non devono contenere una distinta base. Se è necessario specificare il contenuto del file, si suppone di utilizzare un prototipo di livello superiore. Questo è solo un bug di Windows. – tchrist
@tchrist - Sai, questa spiegazione in combinazione con il suggerimento di Josh Lee sarebbe diventata una risposta perfetta. – Saul
Ok, aggiunto.Spero che funzioni. – tchrist