9

ut8 を入力として受け入れるか、ut8 出力を生成するコマンド ライン コマンドとツールを実行する必要があります。だから私はcmdを使用して動作しますが、phpからexecでこれを試しても動作しません。簡単にするために、簡単な出力リダイレクトを試しました。

コマンドプロンプトで直接書くと:

chcp 65001 > nul && echo цчшщюя-öüäß>utf8.txt

uft8.txt が作成され、内容が正しい。

цчшщюя-öüäß

PHP から exec 関数を使用する場合:

$cmd = "chcp 65001 > nul && echo цчшщюя-öüäß>utf8.txt";
exec($cmd,$output,$return);
var_dump($cmd,$output,$return);

utf8.txt の内容がめちゃくちゃです:

¥Å¥Î¥^¥%¥Z¥?-ÇôǬÇÏÇY

(コンソール) コードページ 850 で Win7,64bit を使用しています。

それを修正するにはどうすればよいですか?

追加情報: Windows での utf8 ファイル名の読み取りと書き込みに関するいくつかの問題を克服しようとしています。PHP ファイル関数が失敗します: glob、scandir、file_exists は utf8 ファイル名を正しく処理できません。ファイルが見えない、スキップされた、名前が変更された... したがって、php ファイル関数を避けたいので、いくつかの php extern ファイル処理を探しています。

4

1 に答える 1

10

簡単で高速で信頼性の高い内部 php ソリューションを見つけることができなかったので、それが機能することを知っているものを使用して終了します。コマンド-バッチ-ファイル。実行時に cmd バッチ ファイルを生成する小さな関数を作成します。Unicode に切り替えるために、chcp (コードページの変更) コマンドを先頭に追加するだけです。そして、出力を解析します。

function uft8_exec($cmd,&$output=null,&$return=null)
{
    //get current work directory
    $cd = getcwd();

    // on multilines commands the line should be ended with "\r\n"
    // otherwise if unicode text is there, parsing errors may occur
    $cmd = "@echo off
    @chcp 65001 > nul
    @cd \"$cd\"
    ".$cmd;


    //create a temporary cmd-batch-file
    //need to be extended with unique generic tempnames
    $tempfile = 'php_exec.bat';
    file_put_contents($tempfile,$cmd);

    //execute the batch
    exec("start /b ".$tempfile,$output,$return);

    // get rid of the last two lin of the output: an empty and a prompt
    array_pop($output);
    array_pop($output);

    //if only one line output, return only the extracted value
    if(count($output) == 1)
    {
        $output = $output[0];
    }

    //delete the batch-tempfile
    unlink($tempfile);

    return $output;

}

使い方: php exec() と同じように:

utf8_exec('echo цчшщюя-öüäß>utf8.txt');

また

uft8_exec('echo цчшщюя-öüäß',$output,$return);

于 2012-11-15T08:29:10.250 に答える