Python CGI-UTF-8不';行不通

Python CGI-UTF-8不';行不通,python,html,utf-8,python-3.x,cgi,Python,Html,Utf 8,Python 3.x,Cgi,对于HTML5和Python CGI: 如果我写UTF-8元标记,我的代码就不能工作。 如果我不写,它就行了 页面编码是UTF-8 print("Content-type:text/html") print() print(""" <!doctype html> <html> <head> <meta charset="UTF-8"> </head> <body>

对于HTML5和Python CGI:

如果我写UTF-8元标记,我的代码就不能工作。 如果我不写,它就行了

页面编码是UTF-8

print("Content-type:text/html")
print()
print("""
    <!doctype html>
    <html>
    <head>
        <meta charset="UTF-8">
    </head>
    <body>
        şöğıçü
    </body>
    </html>
""")
print(“内容类型:text/html”)
打印()
打印(“”)
şöğıçü
""")
这个密码不起作用

print("Content-type:text/html")
    print()
    print("""
        <!doctype html>
        <html>
        <head></head>
        <body>
            şöğıçü
        </body>
        </html>
    """)
print(“内容类型:text/html”)
打印()
打印(“”)
şöğıçü
""")
但是这些代码是有效的。

对于CGI,使用
print()
需要为输出设置正确的编解码器
print()
写入和
sys.stdout
已使用特定编码打开,其确定方式取决于平台,并可能因脚本的运行方式而异。将脚本作为CGI脚本运行意味着您几乎不知道将使用什么编码

在您的情况下,web服务器已将文本输出的区域设置为UTF-8以外的固定编码。Python使用该区域设置以该编码生成输出,如果没有
标题,浏览器将正确猜测该编码(或者服务器已在内容类型标题中传达了该编码),但是使用
标题,您将告诉它使用不同的编码,这对于生成的数据是不正确的

显式编码到UTF-8后,您可以直接写入
sys.stdout.buffer
。创建一个帮助器函数以简化此操作:

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>
""")

首先别忘了在文件中设置编码

#!/usr/bin/env python
# -*- coding: utf-8 -*-
然后试试看

import sys
import codecs

sys.stdout = codecs.getwriter("utf-8")(sys.stdout.detach())
或者,如果您使用apache2,请添加到您的配置文件中

AddDefaultCharset UTF-8    
SetEnv PYTHONIOENCODING utf8

您是否指定了源编码?您的编辑器以什么编码保存了您的文件?Python会按字面意思发送您键入的字符串,因此如果您以拉丁语-1编码保存此文件,则将发送该字符串。文件编码:utf-8。正常情况下,它是有效的。我以前的项目成功了。我使用Python3.3。它的默认编码是utf8。顺便说一下,我不会说英语。我有时不明白啊哈,这是重要的信息!在这种情况下,您需要显式编码,真的。如果您能告诉我问题出在哪里,我可以。服务器、浏览器、编辑器、html等?投票重新打开此文件。Python3 CGI打印是一个常见的痛点,远不是一个局部问题。这真的很好,但从我在文档中看到的,这也可能取决于实现
这不是TextIOBase API的一部分,在某些实现中可能不存在
(from)@Zenon:这可能确实适用于某些实现(特别是
StringIO
),但是
stdout
流肯定有一个
.buffer
属性;这在python3.4中是有记录的。不工作,
内部服务器错误
happened@alireza.m:此处发布的代码在Python 3.4上运行良好;我刚才又测试了一遍。恐怕你有不同的问题。使用
导入cgib;cgib.enable()
(请参阅)以获取更有意义的错误。@alireza.m这是正确的方法
print()
如果CGI服务器没有为Python提供正确的编码,则很容易失败(它从来没有提供正确的编码)。当所有其他编码都不正确时,它会工作。但是,我们必须用这种神秘的胡说八道来做一些如此基本的事情,这难道不荒谬吗?谢谢你给出了最简单、最好的答案。将CGI脚本从Python2转换为Python3非常麻烦!
AddDefaultCharset UTF-8    
SetEnv PYTHONIOENCODING utf8