shell_exec("python3 /var/www/html/app.py \"$text\"");
(я надеюсь, что $text
сильно продезинфицировать, избегал, или статического! Если пользовательский ввод получил здесь у вас есть ужасная уязвимость удаленного выполнения кода!)
'\udcd8\udca8\udcd8\udcaa\udcd8\udcb5\udcd8...
ОК, что произошел здесь заключается в том, что PHP передал строку с кодировкой UTF-8 на Python, но Python не знал, что ввод командной строки был UTF-8. (Часто, когда вы запускаете Python в качестве команды, он может работать с вашим терминалом, но нет терминала, когда он работает на PHP под управлением Python на веб-сервере.)
Не зная, какой вход был по умолчанию равным ASCII , Высокие байты на входе недействительны в ASCII, но Python 3 имеет обработчик «surrogateescape» для неверных байтов, который применяется к командной строке при декодировании его в строку Unicode. Это генерирует в противном случае недействительные суррогатные коды UTF-16 U + DC80-U + DCFF, но, по крайней мере, позволяет восстановить исходные высокие байты, если вы захотите.
Так как:
установить переменную PYTHONIOENCODING
окружения UTF-8
перед выполнением Python, поэтому он знает, что правильно кодировка в первую очередь, или
изменить сценарий Python предварительного -Process свой вклад, чтобы восстановить правильный вход с sys.argv[1].encode('utf-8', 'surrogateescape').decode('utf-8')
Какой выход вы ожидаете? Эти кодовые обозначения являются суррогатами. – geoffspear
@Wooble Я хочу использовать этот текст в функции, которая работает с нормальными строками, а не с unicodes. – hpn