我有我与PHP的exec
函数调用Python文件。然后Python输出一个字符串(显然的Unicode,基于使用isinstance
),这是由PHP呼应。我遇到的问题是,如果我的字符串任何特殊字符在它(如度数符号),也不会输出。我敢肯定,我需要做的事情与编码摆弄,但我真的不知道做什么,以及为什么。
编辑:要获得我如何打电话exec
的想法,请参见下面的代码片段:
$tables = shell_exec('/s/python-2.6.2/bin/python2.6 getWikitables.py '.$title);
Python的正常输出,当我打电话getWikitables.py
本身的字符串。
编辑:这肯定似乎是Python的结束无论是东西,还是在传递的结果。当我在PHP中的返回值运行strlen
,我得到0只能exec
接受一定的编码类型?
在PHP中可以使用像utf8_encode()
或utf8_decode()
的方法来解决你的问题。
尝试立即执行每LANG
的Python脚本之前设置http://php.net/shell-exec#85095环境变量:
shell_exec(sprintf(
'LANG=en_US.utf-8; /s/python-2.6.2/bin/python2.6 getWikitables.py %s',
escapeshellarg($title)
));
(使用sprintf()
的(希望)更容易一点点跟着长度的字符串)
您可能还/,而不是需要调用shell_exec()
,每http://php.net/shell-exec#78279之前做到这一点:
$locale = 'en_US.utf-8';
setlocale(LC_ALL, $locale);
putenv('LC_ALL='.$locale);
我有过类似的问题,并用以下解决它。我不明白为什么它是必要的,因为我虽然都已经使用UTF-8进行处理。调用命令行上我的Python脚本工作,但不是通过PHP和Apache的exec(了shell_exec)。
据当你想使用php forum entry需要这一个escapeshellarg()
:
setlocale(LC_CTYPE, "en_US.UTF-8");
它需要在执行之前escapeshellarg()
被调用。此外,有必要设置exec命令之前一定Python environment variable(实测值不相关的暗示here):
putenv("PYTHONIOENCODING=utf-8");
我的Python脚本评估这样的论点:
sys.argv[1].decode("utf-8")
(提示:这是必需的,因为我用的是library一些阿拉伯语文本转换。)
所以最后,我可以想像,原来的问题就可以解决这样说:
setlocale(LC_CTYPE, "en_US.UTF-8");
putenv("PYTHONIOENCODING=utf-8");
$tables = shell_exec('/s/python-2.6.2/bin/python2.6 getWikitables.py ' .
escapeshellarg($title));
但我不能告诉关于返回任何有价值的东西。在我来说,我何尝输出到浏览器直接没有任何问题。
花了很多很多时间找到了......一个的情况下,当我讨厌我的工作;-)