You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP调用Python输出阿拉伯语时触发charmap编码UnicodeEncodeError报错

报错根因

PHP通过exec()调用Python脚本时,Python识别到的标准输出默认编码是系统本地的charmap(通常为cp1252),该编码集不支持阿拉伯语字符,执行print()时Python会自动用当前stdout绑定的编码转码内容,直接触发编码错误。
你在CMD中直接运行脚本正常,是因为CMD终端自身的代码页配置支持对应字符输出,和PHP调用时的运行环境编码参数完全不同,和你解析页面获取阿拉伯语内容的逻辑无关。

可行解决方案
  • 优先方案(适配Python3.7+所有场景,最稳定):在Python脚本开头强制重设标准输出编码,绕过Python的自动编码检测逻辑,修改后的完整代码如下:
import sys
# 强制指定标准输出、错误流编码为UTF-8
sys.stdout.reconfigure(encoding='utf-8')
sys.stderr.reconfigure(encoding='utf-8')

# 保留你原有业务逻辑,以下为示例
from bs4 import BeautifulSoup
# 省略你构造soup对象的页面请求、解析代码
token = soup.find('input', {'name':'EmpName'})['value']
print(token)

对应调整PHP调用代码,避免PHP侧对输出做二次转码:

<?php
exec('python q.py 2>&1', $res);
echo implode("", $res);
?>
  • 兼容方案(无需修改Python代码,适配低版本Python):在调用Python的命令前加环境变量,强制Python进程使用UTF-8作为IO编码,直接修改PHP代码即可:
<?php
// Windows环境用set设置环境变量
echo exec('set PYTHONIOENCODING=utf-8 && python q.py 2>&1');
// 如果是Linux环境,把set替换为export即可
?>
避坑说明

你之前尝试的print(token.encode('cp1252'))、print(token.encode('utf-8'))写法无法解决问题:encode()方法返回的是bytes字节流类型,直接print会输出带b'xxx'格式标记的字节串表示,不仅无法得到正常的阿拉伯语文本,还会触发二次编码报错。

内容的提问来源于stack exchange,提问作者VanMan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 21:36:14