2012-04-05 52 views
1

權限:hunspellphp5。從慶典使用utf-8文本輸入通過shell_exec調用程序

測試代碼:

[email protected] ~/ $ 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 invalid characters

看來了shell_exec無法處理utf-8正確,或者可能需要一些額外的編碼/解碼?我不得不使用en_US.utf-8來獲得有效的數據。

+0

你試過[''proc_open()'](http://php.net/manual/en/function.proc-open.php)嗎?在我看來,就像將數據直接寫入進程一樣'STDIN比通過shell彈出它更可靠...... – DaveRandom 2012-04-05 13:01:51

+1

@DaveRandom同樣的輸出。但我只是檢查了 - mb_detect_encoding(stream_get_contents($ pipes [1]))返回ASCII。這可能是問題所在。 – 2012-04-05 13:14:19

回答

3

試試這個代碼:

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

+1

感謝您的反饋意見。 'mb_detect_encoding'隨機地(每個字符/字)返回ASCII和utf-8。過了一段時間,我試圖將LANG變量設置爲en_US.utf-8,並且它工作正常。謝謝! – 2012-04-05 13:33:57

相關問題