Python CGI – UTF-8 no funciona

Para HTML5 y Python CGI:

Si escribo etiqueta meta UTF-8, mi código no funciona. Si no escribo, funciona.

La encoding de la página es UTF-8.

print("Content-type:text/html") print() print("""       şöğıçü   """) 

Este código no funciona.

 print("Content-type:text/html") print() print("""     şöğıçü   """) 

Pero este código funciona.

Para CGI, el uso de print() requiere que se haya configurado el códec correcto para la salida. print() escribe en sys.stdout y sys.stdout se ha abierto con una encoding específica y la forma en que se determina depende de la plataforma y puede diferir según la forma en que se ejecuta el script. La ejecución de su script como un script CGI significa que prácticamente no sabe qué encoding se utilizará.

En su caso, el servidor web ha establecido la configuración regional para la salida de texto a una encoding fija distinta de UTF-8. Python usa esa configuración regional para producir resultados en esa encoding, y sin el encabezado su navegador adivina correctamente que la encoding (o el servidor la ha comunicado en el encabezado Content-Type), pero con el encabezado usted es indicándole que use una encoding diferente, una que es incorrecta para los datos producidos.

Puede escribir directamente en sys.stdout.buffer , después de codificar explícitamente a UTF-8. Haz una función de ayuda para hacer esto más fácil:

 import sys def enc_print(string='', encoding='utf8'): sys.stdout.buffer.write(string.encode(encoding) + b'\n') enc_print("Content-type:text/html") enc_print() enc_print("""       şöğıçü   """) 

Otro enfoque es reemplazar sys.stdout con un nuevo objeto io.TextIOWrapper() que usa el códec que necesita:

 import sys import io def set_output_encoding(codec, errors='strict'): sys.stdout = io.TextIOWrapper( sys.stdout.detach(), errors=errors, line_buffering=sys.stdout.line_buffering) set_output_encoding('utf8') print("Content-type:text/html") print() print("""     şöğıçü   """) 

Desde https://ru.stackoverflow.com/a/352838/11350

Primero no te olvides de configurar la encoding en el archivo

 #!/usr/bin/env python # -*- coding: utf-8 -*- 

Entonces intenta

 import sys import codecs sys.stdout = codecs.getwriter("utf-8")(sys.stdout.detach()) 

O si usas apache2, agrega a tu configuración.

 AddDefaultCharset UTF-8 SetEnv PYTHONIOENCODING utf8