【问题标题】:Why does PHP 5.5 not produce ANSI colours in the Windows 10 Command Prompt?为什么 PHP 5.5 在 Windows 10 命令提示符中不生成 ANSI 颜色?
【发布时间】:2020-02-25 09:17:42
【问题描述】:

在将生产应用程序更新到现代版本时,我必须使用旧版本的 PHP。我的 Windows 10 开发机器上安装了 PHP 7.3,但旧应用程序需要 PHP 5.5。

我的测试框架以彩色输出,这对于快速检测是否有任何测试失败很有帮助。但是,在 PHP 5.5 中,输出消息与 ANSI 代码交错,使得它们很难阅读。

PHP 7.3 可以使用 ANSI 颜色将文本呈现到控制台,但 PHP 5.5 中的相同代码在输出中生成 ANSI 序列,而不是设置颜色。如果我使用 ANSICON 而不是内置命令提示符,PHP 5.5 和 PHP 7.3 都可以彩色输出。

为什么只有 PHP 5.5 + 命令提示符无法以彩色显示的组合?

命令提示符

C:\>php55 -r "echo """\x1B[36mCyan\x1B[0m""";"
[36mCyan[0m
C:\>php73 -r "echo """\x1B[36mCyan\x1B[0m""";"
Cyan

ANSI 控制台

C:\>php55 -r "echo """\x1B[36mCyan\x1B[0m""";"
Cyan
C:\>php73 -r "echo """\x1B[36mCyan\x1B[0m""";"
Cyan

【问题讨论】:

    标签: php windows-10 command-prompt php-5.5 ansi-escape


    【解决方案1】:

    Windows 控制台在历史上与基于 Unix 的操作系统上的终端非常不同,如 this interesting series of blogposts 中所述。

    在类 Unix 系统上,命令行程序通常不知道它们所连接的终端或控制台,它们只是接收输入并在特殊文件描述符上写入输出。为了定位光标或渲染彩色文本等效果,他们编写了特殊的序列,希望终端能够正确解释。

    在 Windows 上,程序应该知道控制台本身,并使用特殊的 API 来完成定位光标和渲染文本效果等任务。

    但是,最新版本的 Windows 可以解释基于通用“VT100”控制集的特殊序列,但只有在发出 API 调用以启用该功能时才会这样做。见documentation on the feature。此 API 调用在 7.2 开发周期中为 added to Windows builds of PHP,因此旧版本不会开启特殊处理。

    Windows 可以使用替代控制台/终端应用程序,默认情况下它们的工作方式更像它们的 Unix 对应应用程序,因此 PHP 不需要执行任何特殊操作来启用转义序列处理。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-26
    • 1970-01-01
    • 1970-01-01
    • 2017-01-30
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    • 2017-12-28
    相关资源
    最近更新 更多