5

哪个 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 转义序列将不起作用。

4

1 回答 1

6

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


长答案:

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

  • 对于支持十六进制转义 ( \x) 的解析器,则\x1b(字符 0x1B) 应该可以工作。
  • 对于支持八进制转义 ( \ddd) 的解析器,则\033(octal 33) 应该可以工作。
  • 对于支持 unicode 转义 ( \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

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
于 2015-03-09T03:51:25.513 回答