python - ejemplos - django
Python CGI-UTF-8 no funciona (2)
Para CGI, el uso de print()
requiere que el códec correcto se haya configurado para la salida. print()
escribe en sys.stdout
y sys.stdout
se ha abierto con una codificación específica y la forma en que se determina depende de la plataforma y puede diferir en función de cómo se ejecute el script. Ejecutar su secuencia de comandos como una secuencia de comandos CGI significa que no sabe qué codificación se utilizará.
En su caso, el servidor web ha configurado la configuración regional para la salida de texto en una codificación fija distinta de UTF-8. Python usa esa configuración regional para producir salida en esa codificación, y sin el encabezado <meta>
su navegador adivina correctamente esa codificación (o el servidor lo ha comunicado en el encabezado Content-Type), pero con el encabezado <meta>
está diciéndole que use una codificación diferente, una que sea incorrecta para los datos producidos.
Puede escribir directamente en sys.stdout.buffer
, luego de codificar explícitamente en UTF-8. Haga una función auxiliar 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("""
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
şöğıçü
</body>
</html>
""")
Otro enfoque es reemplazar sys.stdout
con un nuevo objeto io.TextIOWrapper()
que utiliza 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("""
<!doctype html>
<html>
<head></head>
<body>
şöğıçü
</body>
</html>
""")
Para HTML5 y Python CGI:
Si escribo Meta Tag UTF-8, mi código no funciona. Si no escribo, funciona.
La codificación de página es UTF-8.
print("Content-type:text/html")
print()
print("""
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
şöğıçü
</body>
</html>
""")
Este código no funciona.
print("Content-type:text/html")
print()
print("""
<!doctype html>
<html>
<head></head>
<body>
şöğıçü
</body>
</html>
""")
Pero esto funciona de códigos.
Desde https://ru..com/a/352838/11350
Primero no te olvides de configurar la codificación 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 usa apache2, agregue a su conf.
AddDefaultCharset UTF-8
SetEnv PYTHONIOENCODING utf8