Laravel API传递UTF-8波斯语字符串到Python脚本无返回值如何解决?
问题原因
该问题是跨语言调用时的编码不匹配导致的:
- 英文属于ASCII字符集,在任意编码下都能正常解析,所以运行正常
- 波斯语属于非ASCII字符,shell、PHP、Python三者只要有一处编码不兼容UTF-8,就会导致参数解析出错,Python抛出编码异常后无标准输出,所以Laravel侧拿到空数组
解决方法
1. 修改Laravel侧代码
做两处调整:强制设置UTF-8区域编码,用内置函数处理参数转义:
// 强制当前进程使用UTF-8编码解析字符 setlocale(LC_ALL, 'en_US.UTF-8'); $command = 'سلام چطوری؟'; // 自动转义特殊字符,适配shell解析规则 $escapedCommand = escapeshellarg($command); $output = []; // 调用Python时加-X utf8参数,强制Python使用UTF-8编码 exec("python -X utf8 ../../../python/main.py $escapedCommand", $output); dd($output);
2. 可选:调整Python代码兼容低版本环境
如果你的Python版本低于3.7,不支持-X utf8参数,可以修改main.py手动处理编码:
import sys import codecs # 强制标准输出用UTF-8编码,避免打印乱码 sys.stdout = codecs.getwriter('utf-8')(sys.stdout.detach()) def main(text): return text if __name__ == '__main__': # 对输入参数做编码兼容处理 x = sys.argv[1].encode('latin-1').decode('utf-8') print(x)
额外排查点
如果修改后仍无输出,先确认运行PHP的用户的系统区域配置:执行locale命令查看是否存在en_US.UTF-8之类的UTF-8编码项,没有的话需要先安装对应系统的UTF-8语言包。
内容的提问来源于stack exchange,提问作者miladjurablu
相关产品推荐
相关产品推荐

