9

我需要执行接受 ut8 作为输入或生成 ut8 输出的命令行命令和工具。所以我使用 cmd 它可以工作,但是当我使用 exec 从 php 尝试这个时它不起作用。为了简单起见,我尝试了简单的输出重定向。

当我直接在命令提示符下写:

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,64 位。

我应该怎么做才能解决这个问题?

附加信息:我正在尝试克服在 Windows 上读取和写入 utf8 文件名的一些问题。PHP 文件函数失败:glob、scandir、file_exists 无法正确处理 utf8 文件名。文件不可见,已跳过,名称已更改...因此我想避免使用 php 文件功能,并且正在寻找一些 php extern 文件处理。

4

1 回答 1

10

由于我找不到一个简单、快速和可靠的内部 php 解决方案,我最终使用我知道它的工作。Cmd-批处理文件。我做了一个小函数,在运行时生成一个 cmd 批处理文件。它只是在 chcp(更改代码页)命令之前添加以切换到 unicode。并解析输出。

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 回答