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
相关产品推荐
相关产品推荐

