Python3.6.4中http.server(CGI模式)中文显示与提交异常求助
解决CGI页面中文乱码与提交后空白问题
针对你遇到的两个问题,我来一步步帮你排查修复:
1. 修复test.py页面中文乱码问题
你当前页面中文显示乱码,核心原因是HTTP响应头未明确指定字符编码——虽然HTML里加了meta标签,但浏览器会优先遵循HTTP响应头的设置,而你只写了Content-Type: text/html,没带charset参数,导致浏览器可能默认用非UTF-8编码解析页面。
修改cgi-bin/test.py代码如下:
# coding=utf-8 from __future__ import unicode_literals, absolute_import # 响应头明确指定UTF-8编码,让浏览器直接用UTF-8解析 print("Content-Type: text/html; charset=utf-8") print() reshtml = '''<!DOCTYPE html> <html lang="zh-CN"> <head> <!-- 修正meta标签标准写法,把charset整合到content属性中 --> <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"/> <button type="submit">Submit</button> </form> </div> </body> </html>''' print(reshtml)
主要改动:
- 响应头追加
; charset=utf-8,强制浏览器使用UTF-8编码 - 修正meta标签的规范写法,避免浏览器解析歧义
- 将页面语言设置为
zh-CN,更贴合中文场景
修改后无需手动切换浏览器编码,页面中文就能正常显示。
2. 修复提交中文后test_form_action.py页面空白问题
页面空白有两个关键原因:参数获取不匹配和输出内容不规范。
看你的test.py里的输入框,name="name",但你在action代码里用form.getvalue("id")获取参数,完全不匹配,导致拿到的是None,打印后页面几乎看不到内容;另外,响应头同样需要指定UTF-8编码,否则输出的中文会乱码或无法显示。
修改cgi-bin/test_form_action.py代码如下:
# coding=utf-8 from __future__ import unicode_literals, absolute_import import cgi, cgitb cgitb.enable() if __name__ == '__main__': # 响应头同样要指定UTF-8编码,确保输出中文正常显示 print("Content-Type: text/html; charset=utf-8") print() form = cgi.FieldStorage() # 匹配输入框的name属性,用"name"作为参数key input_content = form.getvalue("name") # 输出结构化HTML内容,避免页面空白 print("<h3>提交结果:</h3>") print(f"<p>你输入的内容是: {input_content}</p>")
主要改动:
- 响应头添加
; charset=utf-8,保证输出编码正确 - 将
form.getvalue("id")改为form.getvalue("name"),匹配输入框的name属性 - 添加结构化HTML输出,让提交结果清晰可见(原代码仅打印空值或对象,页面无有效内容)
额外注意事项
- 若在Linux/macOS环境下,需给cgi-bin目录下的py文件添加执行权限:
chmod +x cgi-bin/*.py - Python3的cgi模块对中文支持已很完善,只要保持响应头、页面编码统一为UTF-8,就不会出现乱码问题
内容的提问来源于stack exchange,提问作者GoTop
相关产品推荐
相关产品推荐

