Перспективы: 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 * *
Снимок экрана (не удалось отправить код с недопустимыми символами):
Похоже, что 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 😉