2012-04-05 23 views
1

Perquisites:hunspellおよびphp5。バッシュから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を正しく、またはいくつかの追加のエンコード/デコードが必要ですか?

EDIT:有効なデータを取得するためにen_US.utf-8を使用しなければなりませんでした。

+0

['proc_open()'](http://php.net/manual/en/function.proc-open.php)を試しましたか?プロセスに直接データを書き込むのが好きなようです。STDINはシェルを介してバウンスするよりも信頼性が高くなります。 – DaveRandom

+1

@DaveRandom同じ出力。しかし、私はちょうど確認しました - mb_detect_encoding(stream_get_contents($ pipes [1]))はASCIIを返します。それは問題かもしれません。 –

答えて

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'はランダムに(char/word単位で)ASCIIとutf-8を返しました。しばらくして私はLANG変数をen_US.utf-8に設定しようとしました。ありがとう! –

関連する問題