字符编码来自进程的文本缓冲区的问题

时间:2019-02-03 18:30:47

标签: php windows encoding utf-8 console

无法在俄语Windows 10上为控制台进程的输出文本缓冲区设置正确的编码,请提供帮助。需要将控制台输出转换为UTF-8编码并在浏览器中输出。

我尝试了不同的编码:

  • utf-16-> utf-8
  • ascii-> utf-8
  • windows-1251-> utf-8
  • windows-1252-> utf-8

但没有运气:(

仅输出英文字符和数字。 没有俄语符号

<?php

header('Content-Type: text/html; charset=utf-8');

$cmd = "ping mail.ru";

execAndOutput($cmd);

function execAndOutput($cmd){
    $process = popen($cmd, 'r'); 

    while($out = fgets($process, 2048)) { 
        $out = mb_convert_encoding($out, "utf-8", "windows-1251");
        echo $out."<br>\n"; 
        ob_flush();flush(); 
    } 
    pclose($process); 
} ?>

使用编码1251,我已经在输出中得到了

ЋЎ¬Ґ­ Ї ЄҐв ¬Ё б mail.ru [94.100.180.202] б 32 Ў ©в ¬Ё ¤ ­­ле: 
ЋвўҐв ®в 94.100.180.202: зЁб«® Ў ©в=32 ўаҐ¬п=118¬б TTL=49 
ЋвўҐв ®в 94.100.180.202: зЁб«® Ў ©в=32 ўаҐ¬п=118¬б TTL=49 

‘в вЁбвЁЄ  Ping ¤«п 94.100.180.202: 
Џ ЄҐв®ў: ®вЇа ў«Ґ­® = 4, Ї®«г祭® = 4, Ї®вҐап­® = 0 
(0% Ї®вҐам) 
ЏаЁЎ«Ё§ЁвҐ«м­®Ґ ўаҐ¬п ЇаЁҐ¬ -ЇҐаҐ¤ зЁ ў ¬б: 
ЊЁ­Ё¬ «м­®Ґ = 118¬бҐЄ, Њ ЄбЁ¬ «м­®Ґ = 120 ¬бҐЄ, ‘।­ҐҐ = 118 ¬бҐЄ 

我没有进行任何编码转换:

����� ����⠬� � mail.ru [94.100.180.200] � 32 ���⠬� ������: 
�⢥� �� 94.100.180.200: �᫮ ����=32 �६�=113�� TTL=46 
�⢥� �� 94.100.180.200: �᫮ ����=32 �६�=170�� TTL=46 

����⨪� Ping ��� 94.100.180.200: 
����⮢: ��ࠢ���� = 4, ����祭� = 4, ����ﭮ = 0 
(0% �����) 
�ਡ����⥫쭮� �६� �ਥ��-��।�� � ��: 
�������쭮� = 109�ᥪ, ���ᨬ��쭮� = 170 �ᥪ, �।��� = 135 �ᥪ

预期(从Windows终端复制):

Обмен пакетами с 127.0.0.1 по с 32 байтами данных:
Ответ от 127.0.0.1: число байт=32 время<1мс TTL=128
Ответ от 127.0.0.1: число байт=32 время<1мс TTL=128

Статистика Ping для 127.0.0.1:
    Пакетов: отправлено = 4, получено = 4, потеряно = 0
    (0% потерь)
Приблизительное время приема-передачи в мс:
    Минимальное = 0мсек, Максимальное = 0 мсек, Среднее = 0 мсек

我想从浏览器的控制台中获取俄语符号

2 个答案:

答案 0 :(得分:0)

您可以使用<flow name="onNewFile"> <file:listener config-ref="file" directory="test-data/in" autoDelete="true"> <scheduling-strategy> <fixed-frequency frequency="1000"/> </scheduling-strategy> </file:listener> ... </flow> 功能

iconv

您还可以像这样纠正您的编码

iconv('from_encoding', 'to_encoding',$str);

答案 1 :(得分:0)

我对此很满意。

Console settings

在Windows控制台设置中,我发现当前编码为CP866,并将其添加到mb_encoding。

对于控制台中的俄语符号:

mb_convert_encoding($out, 'utf-8', 'cp866');

 iconv('cp866', 'utf-8', $out);

检查您的控制台设置,以计算其使用的编码方式

现在,所有作品都像一个沙姆。非常感谢您的帮助!