Кодировка вывода exec под Windows

Пытаюсь в PHP распарсить вывод команды ping, но всё что кириллицей выходит непонятными символами. Если в начале мы задаём стандартную структуру html и в тело вставляем php код, то всё что написано русскими буквами, выводит нормально, а то что из команды exec, выводит крякозябрами:

<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
<?php
$locale='ru_RU.UTF-8';
setlocale(LC_ALL,$locale);
putenv('LC_ALL='.$locale);
// header("Content-Type: text/html; charset='UTF-8'");

echo 'Анализ...';
$ip='127.0.0.0';
exec("ping -n 3 ".$ip, $output);
    var_dump($output);
    echo $output[8];
    var_dump(str_contains($output[8],"100%"));
    echo mb_internal_encoding();
    echo mb_detect_encoding($output[8]);
?>
</body>
</html>

Выводит это:

Анализ...

D:\web\test\Apache24\htdocs\search\alert_ping.php:41:
array (size=9)
  0 => string '' (length=0)
  1 => string '����� ����⠬� � 127.0.0.0 �� � 32 ���⠬� ������:' (length=50)
  2 => string '��騩 ᡮ�.' (length=11)
  3 => string '��騩 ᡮ�.' (length=11)
  4 => string '��騩 ᡮ�.' (length=11)
  5 => string '' (length=0)
  6 => string '����⨪� Ping ��� 127.0.0.0:' (length=30)
  7 => string '    ����⮢: ��ࠢ���� = 3, ����祭� = 0, ����ﭮ = 3' (length=55)
  8 => string '    (100% �����)' (length=17)

(100% �����)

D:\web\test\Apache24\htdocs\search\alert_ping.php:43:boolean true

UTF-8UTF-8 

Если я пишу только php код и указываю пишу кодировку UTF-8 в заголовок, то вывод команды отображается нормально, а всё то что в коде выводит крякозябрами:

<?php
$locale='ru_RU.UTF-8';
setlocale(LC_ALL,$locale);
putenv('LC_ALL='.$locale);
header("Content-Type: text/html; charset='UTF-8'");

//echo 'Анализ...';
$ip='127.0.0.0';
exec("ping -n 3 ".$ip, $output);
    var_dump($output);
    echo $output[8];
    var_dump(str_contains($output[8],"100%"));
    echo mb_internal_encoding();
    echo mb_detect_encoding($output[8]);
echo 'Проверка';

вывод

D:\web\test\Apache24\htdocs\search\alert_ping.php:34:
array (size=9)
  0 => string '' (length=0)
  1 => string 'Обмен пакетами с 127.0.0.0 по с 32 байтами данных:' (length=50)
  2 => string 'Общий сбой.' (length=11)
  3 => string 'Общий сбой.' (length=11)
  4 => string 'Общий сбой.' (length=11)
  5 => string '' (length=0)
  6 => string 'Статистика Ping для 127.0.0.0:' (length=30)
  7 => string '    Пакетов: отправлено = 3, получено = 0, потеряно = 3' (length=55)
  8 => string '    (100% потерь)' (length=17)

(100% потерь)

D:\web\test\Apache24\htdocs\search\alert_ping.php:36:boolean true

UTF-8UTF-8╨Я╤А╨╛╨▓╨╡╤А╨║╨░

Причём если раскомментировать строку "echo 'Анализ...';" то вывод будет таким:

Ðнализ...

D:\web\test\Apache24\htdocs\search\alert_ping.php:34:
array (size=9)
  0 => string '' (length=0)
  1 => string 'Ž¡¬¥­ ¯ ª¥â ¬¨ á 127.0.0.0 ¯® á 32 ¡ ©â ¬¨ ¤ ­­ëå:' (length=50)
  2 => string 'Ž¡é¨© á¡®©.' (length=11)
  3 => string 'Ž¡é¨© á¡®©.' (length=11)
  4 => string 'Ž¡é¨© á¡®©.' (length=11)
  5 => string '' (length=0)
  6 => string '‘â â¨á⨪  Ping ¤«ï 127.0.0.0:' (length=30)
  7 => string '     ª¥â®¢: ®â¯à ¢«¥­® = 3, ¯®«ã祭® = 0, ¯®â¥àï­® = 3' (length=55)
  8 => string '    (100% ¯®â¥àì)' (length=17)

(100% ¯®â¥àì)

D:\web\test\Apache24\htdocs\search\alert_ping.php:36:boolean true

UTF-8UTF-8Проверка

Как сделать чтобы нормально отображался вывод и из команды exec и из файла php?


Ответы (1 шт):

Автор решения: Ivan Chuzhmakov

Для корректного вывода кириллицы необходимо вывод из команды exec конвертировать из кодировки "CP866" в "UTF-8":

exec("ping -n 3 $ip", $output);
$output=mb_convert_encoding($output, "UTF-8", "CP866");
var_dump($output);
echo "Лёг сервак $ip";

Спасибо за ответ в комментариях.

→ Ссылка