gpt4 book ai didi

python - Python3.6.4中的SimpleHTTPServer无法处理非ASCII字符串(在我的例子中是中文)

转载 作者:太空宇宙 更新时间:2023-11-03 13:58:13 24 4
gpt4 key购买 nike

我通过以下命令在Python3.6.4 64位中运行SimpleHTTPServer:

python -m http.server --cgi

然后我在 test.py 中制作一个表单,将其提交给 test_form_action.py 以打印输入文本。

cgi-bin/test.py

# coding=utf-8
from __future__ import unicode_literals, absolute_import

print("Content-Type: text/html") # HTML is following
print()
reshtml = '''<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html" charset="utf-8"/>
</head>
<body>
<div style="text-align: center;">
<form action="/cgi-bin/test_form_action.py" method="POST"
target="_blank">
输入:<input type="text" id= "id" name="name"/></td>
<button type="submit">Submit</button>
</form>
</div>
</body>
</html>'''

print(reshtml)

cgi-bin/test_form_action.py

# coding=utf-8
from __future__ import unicode_literals, absolute_import

# Import modules for CGI handling
import cgi, cgitb
cgitb.enable()

if __name__ == '__main__':
print("Content-Type: text/html") # HTML is following
print()

form = cgi.FieldStorage()
print(form)
id = form.getvalue("id")
name = form.getvalue("name")

print(id)

当我访问http://127.0.0.1:8000/cgi-bin/test.py时,汉字“输入”显示不正确,看起来像“����”,我必须手动更改此页面的文本编码Firefox 中“Unicode”改为“简体中文”,使汉字看起来正常。

这很奇怪,因为我把 charset="utf-8"放在 cgi-bin/test.py 中。

此外,当我在输入表单中输入一些中文并提交时。但 cgi-bin/test_form_action.py 是空白的。

同时,我运行 SimpleHTTPServer 的 Windows 终端中显示一些错误:

127.0.0.1 - - [23/Mar/2018 23:43:32] b'Error in sys.excepthook:\r\nTraceback (most recent call last):\r\n File "E:\Python\Python36\Lib\cgitb.py", line 26 8, in call\r\n
self.handle((etype, evalue, etb))\r\n File "E:\Python\Python36\Lib\cgitb.py", line 288, in handle\r\n
self.file.write(doc + \'\ n\')\r\nUnicodeEncodeError: \'gbk\' codec can\'t encode character \'\ufffd\' in position 1894: illegal multibyte sequence\r\n\r\nOriginal exception was:\r\nT raceback (most recent call last):\r\n File "G:\Python\Project\VideoHelper\cgi-bin\test_form_action.py", line 13, in \r\n print(form)\r\nUnico deEncodeError: \'gbk\' codec can\'t encode character \'\ufffd\' in position 52: illegal multibyte sequence\r\n' 127.0.0.1 - - [23/Mar/2018 23:43:32] CGI script exit status 0x1

最佳答案

当您使用print()表达式时,Python会将字符串转换为字节,即。它使用默认编解码器对它们进行编码。这个默认值的选择取决于环境——在你的例子中它似乎是GBK(从错误消息来看)。

在 CGI 脚本返回的 HTML 页面中,您将编解码器(“字符集”)指定为 UTF-8。你当然可以将其更改为 GBK,但这只能解决你的第一个问题(test.py 的显示),而不能解决第二个问题(test_form_action.py 中的编码错误)。相反,最好让 Python 在 STDOUT 上发送 UTF-8 编码的数据。

一种方法是替换所有出现的

print(x)

sys.stdout.buffer.write(x.encode('utf8'))

或者,您可以将 sys.stdout 替换为重新编码的包装器,而不更改 print() 出现次数:

sys.stdout = open(sys.stdout.buffer.fileno(), 'w', encoding='utf8'))

注意:这两种解决方案在 Python 2.x 中不起作用(您必须省略其中的 .buffer 部分)。我写这篇文章是因为您的代码具有 from __future__ import 语句,这些语句在仅使用 Python 3 运行的代码中没有用处。

关于python - Python3.6.4中的SimpleHTTPServer无法处理非ASCII字符串(在我的例子中是中文),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49453682/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com