Кодировка вывода 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 шт):
Для корректного вывода кириллицы необходимо вывод из команды exec конвертировать из кодировки "CP866" в "UTF-8":
exec("ping -n 3 $ip", $output);
$output=mb_convert_encoding($output, "UTF-8", "CP866");
var_dump($output);
echo "Лёг сервак $ip";
Спасибо за ответ в комментариях.