从Php脚本

时间:2017-03-21 00:05:39

标签: php gulp command-line-interface artisan

更新

我在下面的答案中添加了问题的解决方案。此外,标题已从旧版本更新为更合适的版本,因为似乎所有128到255之间的字符都会导致问题(扩展的ASCII代码,如下所示:Ascii table)。

旧描述:

我正在尝试输出从Laravel Artisan命令运行的gulp任务的结果(我需要从PHP编译数据然后从多个模块导出资产,然后在主应用程序中一起编译它们)。

一切正常但由于某种原因,“表格”Ascii字符输出不正确,而不是正确的字符(Ôöî)。

详细

请参阅此图片:Gulp output from artisan并将其与直接从gulp到控制台的相同命令输出的所需结果进行比较:The desired output

所以我正在修补这个,有趣的是我得到了错误的结果,即使我只是在我的php文件中使用(由Laravel artisan作为php artisan my-command运行)。错误的结果是echo "─┬──────────────";

我试图转换编码(ÔöÇÔöČÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇÔöÇ),检测编码(php状态“UTF-8”),设置配置值(ini_set output_encoding,internal_encoding,...)并尝试其他各种方法。无济于事......

所以我深入尝试在我的脚本和命令行中使用mb_convert_encoding("─┬──────────────", "UTF-8")ord()来确定实际发生的事情。所以:当我在命令行中运行它时:

chr()

我得$php -a Interactive mode enabled <?php $var = "─┬──────────────"; for($i = 0; $i < strlen($var); $i++) { echo ord($var[$i])."<br/>"; } ?> 196<br/>194<br/>196<br/>196<br/>196<br/>196<br/>196<br/>196<br/>196<br/>196<br/>196<br/>196<br/>196<br/>196<br/>196<br/>196<br/>是从另一个帖子中复制粘贴的,在这种情况下它是一个OK的可视分隔符)

但是当我从文件中运行完全相同的代码(通过php artisan命令运行)时,我得到<br/>

所以我得到226<br/>148<br/>128<br/>226<br/>148<br/>172<br/>226<br/>148<br/>128<br/>226<br/>148<br/>128<br/>226<br/>148<br/>128<br/>226<br/>148<br/>128<br/>226<br/>148<br/>128<br/>226<br/>148<br/>128<br/>226<br/>148<br/>128<br/>226<br/>148<br/>128<br/>226<br/>148<br/>128<br/>226<br/>148<br/>128<br/>226<br/>148<br/>128<br/>226<br/>148<br/>128<br/>226<br/>148<br/>128<br/>226<br/>148<br/>128<br/>(不正确)而不是所需的226 148 128。当我尝试echo chr(196)时,它会输出正确的字符,即使是通过Artisan运行的脚本文件(它打印196)。

此外,当将PHP脚本文件的输出记录到日志文件(通过Laravel的)时,我得到了正确的结果。

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

结论

你知道发生了什么吗?

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

我相信这个问题与Gulp无关,而且很可能与Artisan无关。这很可能是某种编码问题。

非常感谢任何帮助。

我没有想法......

更多信息

带脚本的文件以UTF-8编码。

我使用以下代码来运行gulp任务,但我确信这与真正的问题无关:

\Log::info()

我在Windows 10操作系统上使用cmder作为控制台模拟器。

编辑I:

我从终端的ord()获得了代码。

即。如果通过以下方式在终端中运行,则 $proc = popen($command, 'r'); while (!feof($proc)) { $fread = mb_convert_encoding(fread($proc, 4096), 'utf-8'); \Log::info($fread); print($fread); @ flush(); } pclose($proc); 会返回ord("─")

196

我可以通过在脚本文件中明确使用echo chr(196)输出正确的characted,但echo“─”打印垃圾。

编辑II:

如果我运行php -a Interactive mode enabled <?php echo (ord("─")); ?> ^Z 196 ,我会chcp

如果我使用

Active code page: 852

我得到 $string = "─┬──────────────"; $string = mb_convert_encoding($string, "windows-1252"); 作为脚本的输出。

如果我使用????????????????,我会得到相同的结果。

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

我正在考虑在我打印的每一行上运行$string = mb_convert_encoding($string, "ISO-8859-1");以取代我想要的东西。

或者只是忽略输出的格式化。它很丑,但它是可读的......

1 个答案:

答案 0 :(得分:1)

如果有人遇到同样的问题,此功能可以解决问题:

 /**
 * 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), ";}

如果您缺少某些字符,则可能需要生成自己的字符。(请参阅答案的结尾)。

结论:

这似乎是一个可以接受的解决方案,因为它应该相当快,并解决了这个问题。

更多详情:

由于这个问题让我烦恼,我一直在修改输出和我的开发设置。似乎问题出在PHP输出和控制台之间。扩展ASCII表中的任何字符似乎都不起作用(Ascii table)。 因此我更改了问题的名称以更好地描述问题。

php.ini没有任何变化有帮助,所以我决定这个简单快速的替换。

如果有人更好地了解如何解决问题,我会有兴趣听到它。

值得注意的是,我的命令行打印的某些字符与上述Ascii表中的字符不同。这可能会对这个问题产生影响,但仍然不知道如何解决它。