Por alguna razón, Python parece estar teniendo problemas con BOM al leer cadenas de Unicode de un archivo UTF-8. Considere lo siguiente:¿Por qué las cadenas Unicode de Python requieren un tratamiento especial para la lista de materiales UTF-8?
with open('test.py') as f:
for line in f:
print unicode(line, 'utf-8')
Parece sencillo, ¿no?
Eso es lo que pensaba hasta que me encontré con él desde la línea de comandos y tengo:
UnicodeEncodeError: 'charmap' codec can't encode character u'\ufeff' in position 0: character maps to
<undefined>
Una breve visita a Google reveló que la lista de materiales tiene que ser borrar manualmente:
import codecs
with open('test.py') as f:
for line in f:
print unicode(line.replace(codecs.BOM_UTF8, ''), 'utf-8')
Ésta funciona bien. Sin embargo, estoy luchando para ver algún mérito en esto.
¿Hay alguna razón detrás del comportamiento descrito anteriormente? Por el contrario, UTF-16 funciona sin problemas.
No puede codificarlo porque U + FEFF es un carácter no válido. ¡Se supone que los archivos UTF-8 * no deben contener una lista de materiales en ellos! No son requeridos ni recomendados. Endianness no tiene sentido con unidades de código de 8 bits. También arruinan las cosas, porque ya no puedes hacer 'cat a b c> abc' si esos archivos tienen BOMs extraños (léase: * any *). Las transmisiones UTF-8 no deben contener una lista de materiales. Si necesita especificar el contenido del archivo, se supone que debe usar un prototipo de nivel superior. Esto es solo un error de Windows. – tchrist
@tchrist - Sabes, esta explicación en combinación con la sugerencia de Josh Lee sería una respuesta perfecta. – Saul
Ok, añadido.Espero que eso funcione – tchrist