Unicode для PHP Exec - PullRequest
       0

Unicode для PHP Exec

6 голосов
/ 20 мая 2011

У меня есть файл Python, который я вызываю с помощью функции PHP exec. Затем Python выводит строку (очевидно, Unicode, основанную на использовании isinstance), которая повторяется PHP. Проблема, с которой я сталкиваюсь, заключается в том, что если в моей строке есть какие-либо специальные символы (например, символ степени), она не будет выводиться. Я уверен, что мне нужно что-то сделать, чтобы поиграть с кодировкой, но я не совсем уверен, что делать и почему.

РЕДАКТИРОВАТЬ: Чтобы получить представление о том, как я звоню exec, см. Следующий фрагмент кода:

$tables = shell_exec('/s/python-2.6.2/bin/python2.6 getWikitables.py '.$title);

Python правильно выводит строку, когда я сама вызываю getWikitables.py.

РЕДАКТИРОВАТЬ: Это определенно, кажется, что-то или на конце Python, или в передаче результатов. Когда я запускаю strlen для возвращаемых значений в PHP, я получаю 0. Может ли exec принимать только определенный тип кодировки?

Ответы [ 3 ]

10 голосов
/ 20 мая 2011

Попробуйте установить переменную окружения 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);
1 голос
/ 04 февраля 2019

У меня была похожая проблема, и я решил ее следующим образом.Я не понимаю, зачем это нужно, поскольку я все уже обработал с помощью UTF-8.Вызов моего скрипта Python из командной строки работал, но не с exec (shell_exec) через PHP и Apache.

Согласно записи php на форуме этот нужен, когда вы хотите использовать escapeshellarg():

setlocale(LC_CTYPE, "en_US.UTF-8");

Он должен быть вызван перед выполнением escapeshellarg().Кроме того, необходимо было установить определенную переменную окружения Python перед командой exec (найдена несвязанная подсказка здесь ):

putenv("PYTHONIOENCODING=utf-8");

Мой скрипт Python оцениларгументы, подобные этому:

sys.argv[1].decode("utf-8")

(Подсказка: это было необходимо, потому что я использую библиотеку для преобразования некоторых арабских текстов.)

Итак, наконец, я мог представить, чтоисходный вопрос можно решить следующим образом:

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));

Но я не могу ничего сказать о возвращаемом значении.В моем случае я мог без проблем вывести его в браузер.

Потратил много-много часов, чтобы выяснить это ... Одна из ситуаций, когда я ненавижу свою работу; -)

0 голосов
/ 20 мая 2011

На php вы можете использовать такие методы, как utf8_encode() или utf8_decode(), чтобы решить вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...