PHP怎么加编码_PHP调用Python脚本传参乱码怎么加编码【技巧】-php教程

PHP调用Python脚本中文参数乱码的根本原因是两者默认不共享字符集上下文,需统一locale、用base64传参、subprocess精确控编码,并确保PHP输出头和文件编码为UTF-8。

PHP调用Python脚本时中文参数变问号或怎么办

根本原因不是“没加编码”,而是PHP和Python之间**默认不共享字符集上下文**,shell_exec、exec这类函数本质是启动新进程,环境变量、locale、stdin/stdout编码全靠系统默认——而Windows和Linux默认差异极大。

常见现象:python script.py 你好在终端直接运行正常,但PHP里用exec("python script.py 你好")传进去变成\xe4\xbd\xa0\xe5\xa5\xbd或直接截断/报错;Python脚本里sys.argv[1]拿到的是乱码字节串,decode('utf-8')失败。

  • Linux下优先确认PHP进程的locale:执行locale命令,确保LANG和LC_ALL含UTF-8(如en_US.UTF-8),否则setlocale(LC_ALL, 'en_US.UTF-8')可能无效
  • Windows下cmd默认是GBK,PHP调用时需显式切换:在命令前加chcp 65001 && (即UTF-8代码页)
  • 统一用escapeshellarg()包裹参数,它会按当前PHP locale处理转义,避免空格、引号引发的截断

Python脚本里怎么安全接收PHP传来的中文参数

不能依赖sys.argv[1].decode('utf-8')硬解,因为Python 2/3行为不同,且Linux下sys.argv在非UTF-8 locale中本身就是乱码字节。

更可靠的做法是让PHP把参数base64编码,Python侧再解码:

立即学习“PHP免费学习笔记(深入)”;

php
// PHP端
$param = base64_encode('你好世界');
exec("python script.py $param", $output);
python
# Python端(兼容2/3)
import sys, base64
try:
    arg = sys.argv[1]
    text = base64.b64decode(arg).decode('utf-8')
except (IndexError, UnicodeDecodeError):
    text = ''

这样绕过了终端编码层,也规避了subprocess中encoding参数在Python 2不可用的问题。

用subprocess比exec更可控,但要注意Python版本

PHP调用Python,本质是跨进程通信。用subprocess能精确控制编码,但必须匹配Python版本:

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » PHP怎么加编码_PHP调用Python脚本传参乱码怎么加编码【技巧】-php教程
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4002490+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4002490+
  • 本周更新: 0+
  • 最后更新: 2026-03-16