Tengo un archivo Python al que llamo con la función exec de PHP. Python luego genera una cadena (aparentemente Unicode, basada en el uso de isinstance), que se repite en PHP. El problema con el que me encuentro es que si mi cadena tiene caracteres especiales (como el símbolo de grado), no saldrá. Estoy seguro de que necesito hacer algo para manipular la codificación, pero no estoy seguro de qué hacer y por qué.

EDITAR: para tener una idea de cómo llamo a exec, consulte el siguiente fragmento de código:

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

Python genera correctamente la cadena cuando llamo getWikitables.py por sí mismo.

EDITAR: definitivamente parece ser algo en el extremo de Python o en la transmisión de los resultados. Cuando ejecuto strlen en los valores devueltos en PHP, obtengo 0. ¿exec solo puede aceptar un cierto tipo de codificación?

6
cryptic_star 20 may. 2011 a las 02:30

3 respuestas

La mejor respuesta

En php puede usar métodos como utf8_encode() o utf8_decode() para resolver su problema.

-1
David Rodrigues 13 nov. 2011 a las 18:09

Intente configurar la variable de entorno LANG inmediatamente antes de ejecutar el script Python por 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)
));

(uso de sprintf() para (con suerte) facilitar un poco el seguimiento de la cadena larga)

Es posible que también deba hacer esto antes de llamar a shell_exec(), según http://php.net / shell-exec # 78279:

$locale = 'en_US.utf-8';
setlocale(LC_ALL, $locale);
putenv('LC_ALL='.$locale);
11
15 feb. 2012 a las 02:41

Tuve un problema similar y lo resolví con lo siguiente. No entiendo por qué es necesario, ya que pensé que todo ya está procesado con UTF-8. Llamar a mi script Python en la línea de comando funcionó, pero no con exec (shell_exec) a través de PHP y Apache.

De acuerdo con una entrada en el foro php esta es necesaria cuando se desea use escapeshellarg():

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

Debe llamarse antes de que se ejecute escapeshellarg(). Además, era necesario establecer una determinada variable de entorno Python antes del comando exec (encontró una pista no relacionada aquí):

putenv("PYTHONIOENCODING=utf-8");

Mi script de Python evaluó los argumentos de esta manera:

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

(Sugerencia: fue necesario porque utilizo una biblioteca para convertir algunos textos árabes).

Entonces, finalmente, podría imaginar que la pregunta original podría resolverse de esta manera:

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

Pero no puedo decir nada sobre el valor de retorno. En mi caso, podría enviarlo al navegador directamente sin ningún problema.

Pasé muchas, muchas horas para descubrirlo ... Una de las situaciones en las que odio mi trabajo ;-)

1
robsch 5 feb. 2019 a las 13:50