Tengo un script de Python que carga una página web usando urllib2.urlopen
, hace algo de magia, y escupe los resultados usando print
. corremos el programa en Windows, así:Peter Piper canalizó un programa de Python, y perdió todos sus caracteres Unicode
python program.py > output.htm
aquí está el problema:
El urlopen
lee datos de un servidor web IIS que da salida a UTF8. Escupe estos mismos datos en la salida, sin embargo ciertos caracteres (como el guión largo que Word siempre inserta para usted en contra de su voluntad porque es más inteligente que usted) se confunden y terminan como –
en su lugar.
En una investigación posterior, noté que aunque el servidor web escupe datos UTF8, el archivo output.htm
está codificado con el juego de caracteres ISO-8859-1.
Mis preguntas:
- Al redirigir un programa de Python a un archivo de salida en Windows, no siempre utilizan este conjunto de caracteres?
- Si es así, ¿hay alguna forma de cambiar ese comportamiento?
- Si no es así, ¿hay alguna solución? Supongo que podría pasar el
output.htm
como un parámetro de línea de comando y escribir en ese archivo en lugar de la pantalla, pero tendría que volver a hacer un montón de lógica en mi programa.
¡Gracias por cualquier ayuda!
ACTUALIZACIÓN:
En la parte superior de output.htm
añadí:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
Sin embargo, no hace ninguna diferencia. Los personajes aún están distorsionados. Si cambio manualmente a UTF-8 en Firefox, el archivo se muestra correctamente. Tanto IE como FF piensan que este archivo es ISO occidental, aunque claramente no lo es.
No es una pipa. Es una redirección. Y es 'print' que está haciendo la codificación. El conducto o la redirección se maneja fuera de Python en Windows. –
Si termina "distorsionado" como dices, entonces la salida * es * UTF-8; lo que sea que esté viendo el archivo lo está interpretando como ISO-8859-1. Es decir, ¿el archivo HTML resultante tiene un prólogo XML que indica la codificación o una metaetiqueta que especifica el tipo de contenido? – slyfox
Bueno, eso no es muy aliterativo. –