哪个 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"
Run Code Online (Sandbox Code Playgroud)
我出于习惯一直在使用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 转义序列将不起作用。
简短的回答:这取决于主机字符串解析器。
长答案:
这取决于字符串解析器;"\x1b[1mSome string\x1b[0m"也就是说,实际上将字符串 ( ) 作为文字并使用反斜杠ANSI 转义序列解析转义字符的代码段。
\x) 的解析器,则\x1b(字符 0x1B) 应该有效。\ddd) 的解析器,则\033(八进制 33) 应该可以工作。\u) 的解析器,那么应该\u001B可以工作。快速阐述:
\x和\u相似;\x通常指单个字符,0-255,以h十六进制为基数。\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
Run Code Online (Sandbox Code Playgroud)
Lua也没有:
> console.log("\x1b[31mhello\x1b[0m")
hello
undefined
> console.log("\e[31mhello\e[0m")
e[31mhelloe[0m
undefined
Run Code Online (Sandbox Code Playgroud)
甚至Python:
> print('\x1b[31mhello\x1b[0m')
hello
> print('\e[31mhello\e[0m')
stdin:1: invalid escape sequence near '\e'
Run Code Online (Sandbox Code Playgroud)
尽管PHP确实:
>>> print("\x1b[31mhello\x1b[0m")
hello
>>> print("\e[31mhello\e[0m")
\e[31mhello\e[0m
>>>
Run Code Online (Sandbox Code Playgroud)