最佳的 Ansi Escape 开始方式

6
哪个 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、L-F或换行符、C-R或回车以及退格),因此Ansi转义序列将无法工作。

1个回答

7
短答案:这取决于主机字符串解析器。

长答案:

这取决于字符串解析器;也就是实际接收您的字符串("\x1b[1mSome string\x1b[0m")并使用反斜杠转义字符解析ANSI转义序列的代码段。

  • 对于支持十六进制转义符(\x)的解析器,那么\x1b(字符0x1B)应该可以工作。
  • 对于支持八进制转义符(\ddd)的解析器,那么\033(八进制33)应该可以工作。
  • 对于支持unicode转义符(\u)的解析器,那么\u001B应该可以工作。
快速解释:\x和\u类似; \x通常指单个字符,0-255,在十六进制基数中。 \u意味着相同(因为它用十六进制表示),但支持两个字节(在大多数解析器中)并且通常指16位unicode字符。

一个较少使用/支持的转义字符,如你所提到的,是\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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接