Вызов программы через shell_exec с использованием ввода текста utf-8

Перспективы: hunspell и php5 .

Тестовый код из bash:

 user@host ~/ $ echo 'sagadījās' | hunspell -d lv_LV,en_US Hunspell 1.2.14 + sagadīties 

– работает правильно.

Тестовый код (test.php):

 $encoding = "lv_LV.utf-8"; setlocale(LC_CTYPE, $encoding); // test putenv('LANG='.$encoding); // and another test $raw_response = shell_exec("LANG=$encoding; echo 'sagadījās' | hunspell -d lv_LV,en_US"); echo $raw_response; 

возвращается

 Hunspell 1.2.14 & sagad 5 0: tagad, sagad?ties, sagaudo, sagand?, sagar?o * * 

Снимок экрана (не удалось отправить код с недопустимыми символами): Недопустимые символы Hunspell php

Похоже, что shell_exec не может правильно обрабатывать utf-8, или, может быть, требуется некоторая дополнительная кодировка / декодирование?

EDIT : мне нужно было использовать en_US.utf-8 для получения достоверных данных.

Попробуйте этот код:

 <?php // The word we are checking $subject = 'sagadījās'; // We want file pointers for all 3 std streams $descriptors = array ( 0 => array("pipe", "r"), // STDIN 1 => array("pipe", "w"), // STDOUT 2 => array("pipe", "w") // STDERR ); // An environment variable $env = array( 'LANG' => 'lv_LV.utf-8' ); // Try and start the process if (!is_resource($process = proc_open('hunspell -d lv_LV,en_US', $descriptors, $pipes, NULL, $env))) { die("Could not start Hunspell!"); } // Put pipes into sensibly named variables $stdIn = &$pipes[0]; $stdOut = &$pipes[1]; $stdErr = &$pipes[2]; unset($pipes); // Write the data to the process and close the pipe fwrite($stdIn, $subject); fclose($stdIn); // Display raw output echo "STDOUT:\n"; while (!feof($stdOut)) echo fgets($stdOut); fclose($stdOut); // Display raw errors echo "\n\nSTDERR:\n"; while (!feof($stdErr)) echo fgets($stdErr); fclose($stdOut); // Close the process pointer proc_close($process); ?> эта <?php // The word we are checking $subject = 'sagadījās'; // We want file pointers for all 3 std streams $descriptors = array ( 0 => array("pipe", "r"), // STDIN 1 => array("pipe", "w"), // STDOUT 2 => array("pipe", "w") // STDERR ); // An environment variable $env = array( 'LANG' => 'lv_LV.utf-8' ); // Try and start the process if (!is_resource($process = proc_open('hunspell -d lv_LV,en_US', $descriptors, $pipes, NULL, $env))) { die("Could not start Hunspell!"); } // Put pipes into sensibly named variables $stdIn = &$pipes[0]; $stdOut = &$pipes[1]; $stdErr = &$pipes[2]; unset($pipes); // Write the data to the process and close the pipe fwrite($stdIn, $subject); fclose($stdIn); // Display raw output echo "STDOUT:\n"; while (!feof($stdOut)) echo fgets($stdOut); fclose($stdOut); // Display raw errors echo "\n\nSTDERR:\n"; while (!feof($stdErr)) echo fgets($stdErr); fclose($stdOut); // Close the process pointer proc_close($process); ?> не <?php // The word we are checking $subject = 'sagadījās'; // We want file pointers for all 3 std streams $descriptors = array ( 0 => array("pipe", "r"), // STDIN 1 => array("pipe", "w"), // STDOUT 2 => array("pipe", "w") // STDERR ); // An environment variable $env = array( 'LANG' => 'lv_LV.utf-8' ); // Try and start the process if (!is_resource($process = proc_open('hunspell -d lv_LV,en_US', $descriptors, $pipes, NULL, $env))) { die("Could not start Hunspell!"); } // Put pipes into sensibly named variables $stdIn = &$pipes[0]; $stdOut = &$pipes[1]; $stdErr = &$pipes[2]; unset($pipes); // Write the data to the process and close the pipe fwrite($stdIn, $subject); fclose($stdIn); // Display raw output echo "STDOUT:\n"; while (!feof($stdOut)) echo fgets($stdOut); fclose($stdOut); // Display raw errors echo "\n\nSTDERR:\n"; while (!feof($stdErr)) echo fgets($stdErr); fclose($stdOut); // Close the process pointer proc_close($process); ?> 

Не забудьте проверить, что кодировка файла (и, следовательно, кодирование данных, которые вы передаете) на самом деле является UTF-8 😉