Почему PHP 5.5 не производит цвета ANSI в командной строке Windows 10? - PullRequest
1 голос
/ 30 октября 2019

Мне нужно использовать старую версию 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 + командная строка?

Командная строка

Command Prompt ANSI failure PHP 5.5

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

Консоль ANSI

ANSICON ANSI success PHP 5.5

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

1 Ответ

1 голос
/ 05 ноября 2019

Консоль Windows исторически сильно отличается от терминалов на Unix-системах, о чем говорилось в этой интересной серии постов .

В Unix-подобных системах программы командной строки обычно не знают о терминале или консоли, к которым они подключены, они просто получают ввод и вывод в специальные дескрипторы файлов. Чтобы позиционировать курсор или визуализировать эффекты, такие как цветной текст, они пишут специальные последовательности, которые, как они надеются, терминал будет правильно интерпретировать.

В Windows ожидается, что программа будет знать о самой консоли и использоватьспециальный API для таких задач, как позиционирование курсора и рендеринг текстовых эффектов.

Однако последние версии Windows могут интерпретировать специальные последовательности на основе общего набора элементов управления «VT100», но будет делать это только в том случае, еслиВызов API производится для включения функции . См. документацию по функции . Этот вызов API был добавлен к сборкам Windows PHP во время цикла разработки 7.2, поэтому более старые версии не будут включать специальную обработку.

Альтернативные консольные / терминальные приложения доступны для Windows, которые работаютбольше походит на их аналоги Unix по умолчанию, поэтому PHP не нужно делать ничего особенного, чтобы включить обработку escape-последовательности.

...