在Python 2.7中获取错误“未声明纯文本文档的字符编码。”

时间:2016-01-06 06:49:21

标签: python python-2.7 tomcat cgi

我是新手,使用Apache Tomcat服务器和Python 2.7 CGI脚本。

出于测试目的,我正在进行一些编码,但是我收到以下错误:

  

未声明纯文本文档的字符编码。   该文档将在某些浏览器中使用乱码文本进行渲染   如果文档包含来自外部的字符,则配置   US-ASCII范围。文件的字符编码需要   在传输协议或文件中声明需要使用字节顺序   标记为编码签名

webs.py

import cgi, cgitb   
# Create instance of FieldStorage  
form = cgi.FieldStorage()   
# Get data from fields 
first_name = form.getvalue('first_name') 
last_name  = form.getvalue('last_name')  
print "Content-Type: text/html; charset=utf-8\n\n"
print "<html>" 
print "<head>"
# print "<meta content='text/html;charset=utf-8' http-equiv='Content-Type'>"
# print "<meta content='utf-8' http-equiv='encoding'> "
print "<title>Hello - Second CGI Program</title>" 
print "</head>" 
print "<body>" 
print "<h2>Hello %s %s</h2>" % (first_name, last_name) "
print "</body>" 
print "</html>" 

我的HTML表单:

<form action="/cgi-bin/webs.py" method="post"> 
First Name: <input type="text" name="first_name">  <br />  
Last Name: <input type="text" name="last_name" /> 
<input type="submit" value="Submit" /> 
</form>

1 个答案:

答案 0 :(得分:1)

您应该在HTML文档中放置一个正确的meta http-equiv="Content-Type"(包含表单的页面和CGI脚本生成的HTML)。例如

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

您的脚本中似乎有一对此类<meta>标记,但它们都被注释掉了...

请注意,如果您声明charset是UTF-8,那么您应该确保实际的文档编码为UTF-8。如果它们只包含普通的ASCII安全字符,则不需要执行任何操作,因为这些字符的UTF-8版本与其ASCII代码相同。

顺便说一句,如果您已经在Apache中正确设置了路径,则表单/cgi-bin属性中不需要action

我刚测试了你的Python CGI脚本和一个包含你的表单的正确HTML文件。

的index.html

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>CGI test</title>
</head>

<body>
<form action="cgi-bin/qwebs.py" method="post"> 
First Name: <input type="text" name="first_name">  <br>  
Last Name: <input type="text" name="last_name"> 
<input type="submit" value="Submit"> 
</form>
</body>
</html>

的cgi-bin / qwebs.py

#! /usr/bin/env python

import cgi, cgitb  

# Create instance of FieldStorage  
form = cgi.FieldStorage()

# Get data from fields 
first_name = form.getvalue('first_name') 
last_name  = form.getvalue('last_name')

print "Content-Type: text/html; charset=utf-8\r\n\r\n"
print "<html>" 
print "<head>"
print "<meta content='text/html;charset=utf-8' http-equiv='Content-Type'>"

print "<title>Hello - Second CGI Program</title>" 
print "</head>" 
print "<body>" 
print "<h2>Hello %s %s</h2>" % (first_name, last_name)
print "</body>" 
print "</html>" 

我使用了Python的简单Web服务器:

python -m CGIHTTPServer

默认情况下在端口8000上运行,我将CGI脚本放在当前目录的cgi-bin文件夹中。

一切都按预期工作。所以我怀疑你需要修复你的Apache配置。确保您的CGI路径正确,并且您已将.py个文件称为CGI。