Fedora 24下Python3 CGI脚本UTF-8编码配置问题求助
这问题我之前碰到过好几次,核心就是Apache运行CGI进程时的locale环境没正确设置成UTF-8,导致Python默认用ASCII去处理带Ä、Ö这类德语特殊字符的文件名。下面给你几个实用的解决办法,按优先级来试:
1. 修改Apache配置,全局设置UTF-8环境变量
既然你已经加载了mod_env模块,直接在Apache的配置文件里(比如/etc/httpd/conf/httpd.conf或者站点专属的*.conf配置文件)添加以下内容:
SetEnv LANG en_US.UTF-8 SetEnv LC_ALL en_US.UTF-8
保存配置后,重启Apache服务让设置生效:
sudo systemctl restart httpd
这样所有CGI脚本都会继承这个UTF-8的locale环境,Python的locale.getpreferredencoding()就会返回UTF-8了,这是最彻底的解决方式。
2. 在Python脚本内强制指定编码(兜底方案)
如果修改Apache配置不方便,或者只想针对这个脚本单独设置,可以在脚本开头加入以下代码,强制切换到UTF-8编码:
import locale import sys # 强制设置全局locale为UTF-8 locale.setlocale(locale.LC_ALL, 'en_US.UTF-8') # 同时建议配置标准输出/错误的编码,避免输出内容乱码 sys.stdout.reconfigure(encoding='utf-8') sys.stderr.reconfigure(encoding='utf-8')
注意:这个方法需要系统已经安装了en_US.UTF-8的locale包,Fedora 24默认应该自带,如果没有的话,先执行下面的命令安装:
sudo localedef -i en_US -f UTF-8 en_US.UTF-8
3. 检查并设置系统全局locale
有时候系统本身的全局locale不是UTF-8,也会影响Apache进程的环境。编辑/etc/locale.conf文件,添加或修改成以下内容:
LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8
执行source /etc/locale.conf让设置立即生效,再重启Apache服务即可。这是系统层面的设置,能确保所有进程默认都使用UTF-8环境。
验证设置是否生效
修改完成后,可以在CGI脚本里加一段测试代码,确认编码是否切换成功:
import locale print(f"Content-Type: text/plain; charset=utf-8\n") print(f"Preferred encoding: {locale.getpreferredencoding().name}")
访问这个脚本后,如果输出Preferred encoding: UTF-8,就说明设置成功了,此时再写入带Ä、Ö的文件名应该就不会触发编码错误了。
内容的提问来源于stack exchange,提问作者Dierk Meyer

