Apache 服务器运行Python CGI脚本出现中文乱码的原因与解决方法
很多开发者在Apache服务器上部署Python CGI脚本时,会遇到添加中文字符后输出乱码的问题。这种情况通常不是代码逻辑错误,而是字符编码没有统一配置导致的。下面我们就来详细分析问题的成因,并提供对应的解决思路。
一、中文乱码的常见原因
Python CGI脚本的中文乱码问题,本质是多环节编码不匹配导致的,主要涉及三个环节:
- Python脚本文件本身的编码
- CGI脚本输出内容的编码声明
- Apache服务器对CGI输出的默认编码设置
如果这三个环节的编码没有统一,比如脚本文件用UTF-8保存,但是输出时没有声明UTF-8编码,或者Apache默认用其他编码解析输出内容,就会出现中文乱码。
二、典型错误示例
下面是一个容易出现中文乱码的基础CGI脚本示例,我们来看看问题出在哪里:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# 输出HTTP响应头
print("Content-Type: text/html")
print()
# 输出包含中文的内容
print("<html>")
print("<head><title>CGI中文测试</title></head>")
print("<body>")
print("<h1>你好,这是中文测试内容</h1>")
print("</body>")
print("</html>")这个脚本虽然在第一行声明了文件编码为UTF-8,但是HTTP响应头的Content-Type没有指定字符集,Apache服务器默认可能用ISO-8859-1或者其他编码解析输出内容,就会导致中文显示为乱码。
三、解决中文乱码的方法
1. 完善HTTP响应头的编码声明
在输出Content-Type时,明确指定字符集为UTF-8,这是最直接的解决方式:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# 输出带UTF-8字符集的HTTP响应头
print("Content-Type: text/html; charset=utf-8")
print()
print("<html>")
print("<head><title>CGI中文测试</title></head>")
print("<body>")
print("<h1>你好,这是正常显示的中文内容</h1>")
print("</body>")
print("</html>")2. 确保脚本文件编码统一
保存Python脚本时,要选择UTF-8无BOM格式编码,避免文件本身的编码和声明的不一致。如果使用编辑器编写代码,可以在保存时手动选择编码格式。
3. 配置Apache服务器的默认编码
如果希望所有CGI脚本默认使用UTF-8编码,可以修改Apache的配置文件(通常是httpd.conf或者虚拟主机配置文件),添加如下配置:
# 设置CGI输出的默认字符集为UTF-8
AddDefaultCharset UTF-8
# 如果只对CGI脚本生效,可以添加条件配置
<IfModule mod_cgi.c>
AddHandler cgi-script .py
AddDefaultCharset UTF-8
</IfModule>修改完成后重启Apache服务,配置即可生效。
四、其他注意事项
如果脚本中需要读取外部文件的中文内容,也要确保读取文件时指定正确的编码:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
print("Content-Type: text/html; charset=utf-8")
print()
# 读取UTF-8编码的文本文件
try:
with open("test.txt", "r", encoding="utf-8") as f:
content = f.read()
print(f"<p>读取到的内容:{content}</p>")
except Exception as e:
print(f"<p>读取失败:{str(e)}</p>")另外,如果使用的是Python 2版本,还需要注意字符串的编码转换,建议优先使用Python 3版本开发CGI脚本,能减少很多编码相关的问题。
ApachePython CGI中文乱码字符编码服务器配置修改时间:2026-05-23 16:33:56