Vamos a examinar ese mensaje de error muy de cerca:
"UnicodeDecodeError: 'utf8' codec no puede decodificar bytes en la posición 8-13: gama de códigos Unicode no soportado"
Nota cuidadosamente que dice "bytes en la posición 8-13 "- es una secuencia de 6 bytes UTF-8. Eso podría haber sido válido en las edades oscuras, pero ya que Unicode se congeló en 21 bits, el máximo es de CUATRO bytes. Validación UTF-8 e informe de errores were tightened up recently; como una cuestión de interés, ¿exactamente qué versión de Python está ejecutando?
Con al menos 2.7.1 y 2.6.6, ese error se vuelve más útil "... no se puede decodificar el byte XXXX en la posición 8: byte de inicio no válido" donde XXXX solo puede ser 0xfc o 0xfd si el el mensaje anterior sugería una secuencia de 6 bytes. En ISO-8859-1 o cp1252, 0xfc representa U + 00FC LETRA U MINÚSCULA PEQUEÑA CON DIAESIS (también conocido como u-umlaut, probable sospechoso); 0xfd representa U + 00FD LETRA Y MINÚSCULA LATINA CON AGUDA (menos probable).
El problema NO es con la declaración if line.startswith(u"Fußnote"):
en su archivo fuente. Habría recibido un mensaje en la hora de COMPILAR si no era el UTF-8 correcto, y el mensaje habría comenzado con "SyntaxError", no con "UnicodeDecodeError". En cualquier caso, la codificación UTF-8 de esa cadena tiene solo 8 bytes de longitud, no 14.
El problema es (como ha señalado @Mark Tolonen) en cualquier "línea" que se refiera. Solo puede ser un objeto str.
Para obtener más información debe responder a las preguntas de Mark (1) resultado de print repr(line)
(2) site.py
cambio.
En esta etapa es una buena idea despejar el aire sobre la mezcla de objetos str
y unicode
(en muchas operaciones, no solo en a.startswith(b)
).
A menos que se define la operación para producir un objeto str
, no va a coaccionar el objeto unicode
a str
. Este no es el caso con a.startswith(b)
. Intentará decodificar el objeto str
utilizando la codificación predeterminada (generalmente 'ascii').
Ejemplos:
>>> "\xff".startswith(u"\xab")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xff in position 0: ordinal not in range(128)
>>> u"\xff".startswith("\xab")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xab in position 0: ordinal not in range(128)
Además, No es correcto decir "mezcla y se obtiene UnicodeDecodeError". Es muy posible que el objeto str
esté codificado de forma válida en la codificación predeterminada (generalmente 'ascii'): no se genera ninguna excepción.
Ejemplos:
>>> "abc".startswith(u"\xff")
False
>>> u"\xff".startswith("abc")
False
>>>
¿Cómo se sabe con certeza que es realmente UTF-8. ¿Puedes mirar la salida apropiada de 'od -t c' en el archivo (si es Unix)? –
También hay 'hexdump -C' en la mayoría de las distribuciones de GNU/Linux y' hd (1) 'en FreeBSD. –
Gracias a todos por las excelentes respuestas, me mudé y estoy lejos de mi caja de Windows en la que estaba trabajando. Me estaba arrancando los pelos por esto, pero creo que finalmente entiendo Unicode. Cuando regrese, aceptaré una respuesta. – Mark