Python CGI-UTF-8不';行不通
对于HTML5和Python CGI: 如果我写UTF-8元标记,我的代码就不能工作。 如果我不写,它就行了 页面编码是UTF-8Python 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>
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