“打印扩展Ascii”的问题;表「;从Php脚本到控制台的代码(例如─;、┬;) 更新

“打印扩展Ascii”的问题;表「;从Php脚本到控制台的代码(例如─;、┬;) 更新,php,gulp,command-line-interface,laravel-artisan,Php,Gulp,Command Line Interface,Laravel Artisan,我在下面的回答中添加了问题的解决方案。此外,该标题已从旧标题更新为更合适的标题,因为从128到255的所有字符似乎都会引起问题(扩展ASCII码,如图所示:) 更新二 将PHP更新到7.1.30之后,这个问题似乎消失了(较低版本也可以)。 值得注意的是,我下面的修复程序反而在较新版本中导致了有问题的输出: 此外,在答案中使用helper函数显然会导致问题,因为它会产生胡言乱语: for($i=128; $i<256; $i++) {echo "'" . chr($i)

我在下面的回答中添加了问题的解决方案。此外,该标题已从旧标题更新为更合适的标题,因为从128到255的所有字符似乎都会引起问题(扩展ASCII码,如图所示:)

更新二 将PHP更新到7.1.30之后,这个问题似乎消失了(较低版本也可以)。 值得注意的是,我下面的修复程序反而在较新版本中导致了有问题的输出: 此外,在答案中使用helper函数显然会导致问题,因为它会产生胡言乱语:

for($i=128; $i<256; $i++) {echo "'" . chr($i) . "', ";}
'�', '�', '�', '�', '�', '�',...
我得到了
196
194
196
196
196
196
196
196
196
196
196
196
196
196
196

是从另一个线程复制粘贴的,在本例中它是一个OK可视分隔符)

但是当我从文件中运行完全相同的代码时(通过php artisan命令运行),我明白了上述两个<
226<
<
上述两个

<
<
226<
<
<
上述两个


226




<
<<
<
<
<<
<<<<
<<<
<<<<<
<<
<<<
<<<<<<<<<<<

<<<<<<<<<
<<
<<<<<
<<<<<<<<<<<
<<<<<<<<<
<
<<<<<<<<<<<<


226
148
128
226
148
128
226
148
128
226
148
128
226
148
128

因此,我得到的是
226148128
(不正确),而不是所需的
196
。当我尝试echo chr(196)时,它会打印正确的字符,甚至是通过Artisan运行的脚本文件(它打印

另外,当将php脚本文件的输出记录到日志文件时(通过Laravel的
\log::info()
),我确实得到了正确的结果

只有在从文件运行脚本并打印到控制台时,才会出现问题

结论 你知道发生了什么事吗

为什么所有其他字符都能正确打印出来,即使是错误的字符也能正确打印在日志中,但不能正确打印到控制台中

我认为这个问题与吞咽无关,很可能与工匠无关。这很可能是某种编码问题

任何帮助都将不胜感激

我没有主意了

更多信息 带有脚本的文件以UTF-8编码

我使用以下代码来运行gulp任务,但我相当确定这与实际问题无关:

    $proc = popen($command, 'r');
    while (!feof($proc))
    {
        $fread = mb_convert_encoding(fread($proc, 4096), 'utf-8');

        \Log::info($fread);

        print($fread);
        @ flush();
    }

    pclose($proc);
我将cmder用作Windows 10操作系统上的控制台仿真器

编辑一: 我从终端的ord()中得到了代码

即,
ord(“─")返回
196

php -a
Interactive mode enabled

<?php
echo (ord("─"));
?>
^Z
196
我将
?????
作为脚本的输出

如果我使用
$string=mb\u convert\u编码($string,“ISO-8859-1”);
,我会得到相同的结果

为什么所有其他字符都打印正确?(参见上面我的第一张图片)↑). 所有字母,所有颜色,所有格式都可以,除了那几个特殊字符


我正在考虑在我打印的每一行上运行
str_replace()
,用我想要的替换我得到的


或者忽略输出的格式化。虽然很难看,但可读性很强…

如果有人遇到相同的问题,此函数将修复该问题:

 /**
 * Fixes the extended ASCII characters incorrectly displayed into console.
 *
 * @param string $text
 *
 * @return string
 */
function convertExtendedAsciiCharacters($text)
{
    return str_replace(
        ['Ç', 'ü', 'é', 'â', 'ä', 'ů', 'ć', 'ç', 'ł', 'ë', 'Ő', 'ő', 'î', 'Ź', 'Ä', 'Ć', 'É', 'Ĺ', 'ĺ', 'ô', 'ö', 'Ľ', 'ľ', 'Ś', 'ś', 'Ö', 'Ü', 'Ť', 'ť', 'Ł', '×', 'č', 'á', 'í', 'ó', 'ú', 'Ą', 'ą', 'Ž', 'ž', 'Ę', 'ę', '¬', 'ź', 'Č', 'ş', '«', '»', '░', '▒', '▓', '│', '┤', 'Á', 'Â', 'Ě', 'Ş', '╣', '║', '╗', '╝', 'Ż', 'ż', '┐', '└', '┴', '┬', '├', '─', '┼', 'Ă', 'ă', '╚', '╔', '╩', '╦', '╠', '═', '╬', '¤', 'đ', 'Đ', 'Ď', 'Ë', 'ď', 'Ň', 'Í', 'Î', 'ě', '┘', '┌', '█', '▄', 'Ţ', 'Ů', '▀', 'Ó', 'ß', 'Ô', 'Ń', 'ń', 'ň', 'Š', 'š', 'Ŕ', 'Ú', 'ŕ', 'Ű', 'ý', 'Ý', 'ţ', '´', '­', '˝', '˛', 'ˇ', '˘', '§', '÷', '¸', '°', '¨', '˙', 'ű', 'Ř', 'ř', '■', ' '],
        [chr(128), chr(129), chr(130), chr(131), chr(132), chr(133), chr(134), chr(135), chr(136), chr(137), chr(138), chr(139), chr(140), chr(141), chr(142), chr(143), chr(144), chr(145), chr(146), chr(147), chr(148), chr(149), chr(150), chr(151), chr(152), chr(153), chr(154), chr(155), chr(156), chr(157), chr(158), chr(159), chr(160), chr(161), chr(162), chr(163), chr(164), chr(165), chr(166), chr(167), chr(168), chr(169), chr(170), chr(171), chr(172), chr(173), chr(174), chr(175), chr(176), chr(177), chr(178), chr(179), chr(180), chr(181), chr(182), chr(183), chr(184), chr(185), chr(186), chr(187), chr(188), chr(189), chr(190), chr(191), chr(192), chr(193), chr(194), chr(195), chr(196), chr(197), chr(198), chr(199), chr(200), chr(201), chr(202), chr(203), chr(204), chr(205), chr(206), chr(207), chr(208), chr(209), chr(210), chr(211), chr(212), chr(213), chr(214), chr(215), chr(216), chr(217), chr(218), chr(219), chr(220), chr(221), chr(222), chr(223), chr(224), chr(225), chr(226), chr(227), chr(228), chr(229), chr(230), chr(231), chr(232), chr(233), chr(234), chr(235), chr(236), chr(237), chr(238), chr(239), chr(240), chr(241), chr(242), chr(243), chr(244), chr(245), chr(246), chr(247), chr(248), chr(249), chr(250), chr(251), chr(252), chr(253), chr(254), chr(255)],
        $text);
}
该函数是使用以下命令生成的:

for($i=128; $i<256; $i++) {echo "'" . chr($i) . "', ";}
for($i=128; $i<256; $i++) {echo "chr($i), ";}

for($i=128;$i)在不使用UTF-8的终端上,您的输出是UTF-8,但可能是某些8位编码,如ISO-8859-1(拉丁语-1)或其近亲。请更改终端设置,或更改脚本以输出正确的编码。请注意,>=128的字符不是ASCII(ASCII为7位,在127处停止)。当您运行Windows时,很可能是Windows-1252编码。@jcaron我想他指的是“ASCII艺术”。在为Windows-1252设置的Windows中,控制台很可能是CP437。@Jan Go
chcp
。这些字符代码是从哪里来的?试试这个讨论。顺便说一句,这里没有“扩展ASCII”和““某个时间点某个网页上显示的扩展ASCII”是非常任意的。如果您使用的是扩展ASCII编码之一,请找出是哪一种。
 /**
 * Fixes the extended ASCII characters incorrectly displayed into console.
 *
 * @param string $text
 *
 * @return string
 */
function convertExtendedAsciiCharacters($text)
{
    return str_replace(
        ['Ç', 'ü', 'é', 'â', 'ä', 'ů', 'ć', 'ç', 'ł', 'ë', 'Ő', 'ő', 'î', 'Ź', 'Ä', 'Ć', 'É', 'Ĺ', 'ĺ', 'ô', 'ö', 'Ľ', 'ľ', 'Ś', 'ś', 'Ö', 'Ü', 'Ť', 'ť', 'Ł', '×', 'č', 'á', 'í', 'ó', 'ú', 'Ą', 'ą', 'Ž', 'ž', 'Ę', 'ę', '¬', 'ź', 'Č', 'ş', '«', '»', '░', '▒', '▓', '│', '┤', 'Á', 'Â', 'Ě', 'Ş', '╣', '║', '╗', '╝', 'Ż', 'ż', '┐', '└', '┴', '┬', '├', '─', '┼', 'Ă', 'ă', '╚', '╔', '╩', '╦', '╠', '═', '╬', '¤', 'đ', 'Đ', 'Ď', 'Ë', 'ď', 'Ň', 'Í', 'Î', 'ě', '┘', '┌', '█', '▄', 'Ţ', 'Ů', '▀', 'Ó', 'ß', 'Ô', 'Ń', 'ń', 'ň', 'Š', 'š', 'Ŕ', 'Ú', 'ŕ', 'Ű', 'ý', 'Ý', 'ţ', '´', '­', '˝', '˛', 'ˇ', '˘', '§', '÷', '¸', '°', '¨', '˙', 'ű', 'Ř', 'ř', '■', ' '],
        [chr(128), chr(129), chr(130), chr(131), chr(132), chr(133), chr(134), chr(135), chr(136), chr(137), chr(138), chr(139), chr(140), chr(141), chr(142), chr(143), chr(144), chr(145), chr(146), chr(147), chr(148), chr(149), chr(150), chr(151), chr(152), chr(153), chr(154), chr(155), chr(156), chr(157), chr(158), chr(159), chr(160), chr(161), chr(162), chr(163), chr(164), chr(165), chr(166), chr(167), chr(168), chr(169), chr(170), chr(171), chr(172), chr(173), chr(174), chr(175), chr(176), chr(177), chr(178), chr(179), chr(180), chr(181), chr(182), chr(183), chr(184), chr(185), chr(186), chr(187), chr(188), chr(189), chr(190), chr(191), chr(192), chr(193), chr(194), chr(195), chr(196), chr(197), chr(198), chr(199), chr(200), chr(201), chr(202), chr(203), chr(204), chr(205), chr(206), chr(207), chr(208), chr(209), chr(210), chr(211), chr(212), chr(213), chr(214), chr(215), chr(216), chr(217), chr(218), chr(219), chr(220), chr(221), chr(222), chr(223), chr(224), chr(225), chr(226), chr(227), chr(228), chr(229), chr(230), chr(231), chr(232), chr(233), chr(234), chr(235), chr(236), chr(237), chr(238), chr(239), chr(240), chr(241), chr(242), chr(243), chr(244), chr(245), chr(246), chr(247), chr(248), chr(249), chr(250), chr(251), chr(252), chr(253), chr(254), chr(255)],
        $text);
}
for($i=128; $i<256; $i++) {echo "'" . chr($i) . "', ";}
for($i=128; $i<256; $i++) {echo "chr($i), ";}