最好的安西逃生开始

时间:2014-10-02 01:45:51

标签: 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

注:

上面的所有转义序列都适用于我所使用的所有Unix系统,但是仍然必须依赖系统本身来解释转义码。例如,Windows 允许任何类型的转义码除了四个(BEL,LF或换行,CR或回车,当然还有BS或退格),因此Ansi转义序列不起作用

1 个答案:

答案 0 :(得分:2)

简答:这取决于主机字符串解析器。


答案很长:

这取决于字符串解析器;也就是说,实际接受字符串("\x1b[1mSome string\x1b[0m")作为文字的代码片段,并使用反斜杠escape characters解析ANSI escape sequence

  • 对于支持十六进制转义(\x)的解析器,\x1b(字符0x1B)应该有效。
  • 对于支持八进制转义(\ddd)的解析器,\033(八进制33)应该有效。
  • 对于支持unicode转义(\u)的解析器,\u001B应该有效。
  

快速阐述:\x\u相似; \x通常是指 h 十字形基数中的单个字符0-255。 \u表示相同(因为它以十六进制表示),但支持两个字节(在大多数解析器中),通常是指16位 u nicode字符。


如您所述,较小的已使用/支持的转义字符为\e。这种转义最常用于期望发生大量ANSI转义的解析器/语言,例如bash(以及大多数其他shell)。

例如,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