Лучшее начало Ansi Escape

Какая управляющая последовательность Ansi является наиболее переносимой и/или просто лучшей и почему?

1. "\u001B[32;1mThis is bright green\u001B[0m"
2. "\x1B[33;1mThis is bright yellow\x1B[0m"
3. "\e[35;4;1mThis is bright purple underlined\e[0m"

Я использовал printf "\x1B[32;1mgreen\x1B[0m" (например, это пример в сценарии unix bash) по привычке, но мне было интересно, есть ли какие-либо причины использовать один над другим. Является ли один более портативным, чем другие? Это было бы моим предположением.

Кроме того, если вы знаете какую-либо другую последовательность Ansi Escape, не стесняйтесь поделиться ею в комментариях или в конце своего ответа.

Если вы не знаете, что такое последовательность Ansi Escape, или хотите познакомиться с ней поближе, то вот вам: http://en.wikipedia.org/wiki/ANSI_escape_code

ПРИМЕЧАНИЕ:

Все приведенные выше escape-последовательности работали во всех системах Unix, на которых я работал, однако для интерпретации escape-кодов все равно нужно полагаться на саму систему. Windows, например, не разрешает использовать escape-коды любого вида, кроме четырех (BEL, LF или перевод строки, CR или возврат каретки и, конечно же, BS или backspace), поэтому escape-последовательности Ansi не будут работать. .


person dylnmc    schedule 02.10.2014    source источник


Ответы (1)


Краткий ответ: Это зависит от синтаксического анализатора строк хоста.


Длинный ответ:

Это зависит от анализатора строк; то есть фрагмент кода, который фактически принимает вашу строку ("\x1b[1mSome string\x1b[0m") как литерал и анализирует экранирующие символы с помощью обратной косой черты управляющей последовательности ANSI.

  • Для синтаксических анализаторов, поддерживающих шестнадцатеричные escape-последовательности (\x), должно работать \x1b (символ 0x1B).
  • Для синтаксических анализаторов, поддерживающих восьмеричные escape-последовательности (\ddd), должно работать \033 (восьмеричное 33).
  • Для синтаксических анализаторов, которые поддерживают экранирование юникода (\u), должно работать \u001B.

Быстрая проработка: \x и \u похожи; \x обычно относится к одному символу от 0 до 255 в h шестнадцатеричной системе счисления. \u означает то же самое (поскольку оно представлено в шестнадцатеричном виде), но поддерживает два байта (в большинстве парсеров) и обычно относится к 16-битным символам unicode.


Как вы упомянули, менее используемый/поддерживаемый escape-символ - \e. Это экранирование чаще всего используется с парсерами/языками, которые ожидают много экранирования ANSI, таких как bash (и большинство других оболочек).

Например, Node.js не поддерживает \e:

> console.log("\x1b[31mhello\x1b[0m")
hello
undefined
> console.log("\e[31mhello\e[0m")
e[31mhelloe[0m
undefined

Не работает и Lua:

> print('\x1b[31mhello\x1b[0m')
hello
> print('\e[31mhello\e[0m')
stdin:1: invalid escape sequence near '\e'

Или даже Python:

>>> print("\x1b[31mhello\x1b[0m")
hello
>>> print("\e[31mhello\e[0m")
\e[31mhello\e[0m
>>>

Хотя PHP делает:

<?php
echo "\x1b[31mhello\x1b[0m\n"; // hello
echo "\e[31mhello\e[0m\n"; // hello
person Qix - MONICA WAS MISTREATED    schedule 09.03.2015