Python读取含ê字符的葡萄牙语文本文件时的编码异常问题
问题原因分析
当通过PHP的exec()或shell_exec()调用Python脚本时,子进程的环境变量与终端直接运行时存在差异。Linux终端会话通常会将LANG或LC_*系列环境变量设置为UTF-8(例如LANG=en_US.UTF-8),但PHP运行在Web服务器(如Apache、Nginx)环境下时,子进程的默认环境编码可能被设为ASCII。此时Python输出含特殊字符的内容时,会尝试用ASCII编码处理,从而触发编码错误。
尽管Python默认编码为UTF-8,但输出流的编码会继承系统环境设置,当环境编码为ASCII时,print()语句输出UTF-8字符就会失败。
解决方案建议
1. 在Python脚本中显式指定输出流编码
修改Python脚本,强制标准输出使用UTF-8编码,摆脱对环境变量的依赖:
import sys sys.stdout.reconfigure(encoding='utf-8') filename = "newfile.txt" with open(filename, "r", encoding="utf-8") as file: file_content = file.readline().strip() print(file_content)
2. 在PHP命令中临时设置环境变量
调用Python脚本前,先设置LANG环境变量为UTF-8,确保子进程使用正确编码:
<html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta content="text/html; charset=utf-8" http-equiv="Content-Type" /> <title>read python</title> </head> <body> <?php $pythonScript = "read.py"; // 设置UTF-8环境变量后执行Python脚本 $command = "LANG=en_US.UTF-8 python3 " . $pythonScript; $output = shell_exec($command); echo $output; ?> </body> </html>
3. 全局配置Web服务器环境变量
如果临时设置无效,可在Web服务器配置文件中全局指定UTF-8环境变量:
- Apache:在
httpd.conf或虚拟主机配置中添加SetEnv LANG en_US.UTF-8 - Nginx:在FastCGI配置块中添加
env LANG=en_US.UTF-8;
这样所有PHP触发的子进程都会继承正确的编码环境。
内容的提问来源于stack exchange,提问作者user2105386
相关产品推荐
相关产品推荐

