大多数编程语言可以使用\033[...m
来进行ANSI终端颜色转义。(在某些语言中,您可能需要使用\e
或\x1b
)
对我来说总是很奇怪的是它们以\033[
开始,但以m
结束。这是否有一些历史原因(例如,]
是否被映射到现在在ASCII表中占据的m
槽位?)还是任意字符选择?
大多数编程语言可以使用\033[...m
来进行ANSI终端颜色转义。(在某些语言中,您可能需要使用\e
或\x1b
)
对我来说总是很奇怪的是它们以\033[
开始,但以m
结束。这是否有一些历史原因(例如,]
是否被映射到现在在ASCII表中占据的m
槽位?)还是任意字符选择?
对Thomas Dickey的回答进行了一些扩展。
ECMA-48的第8.3.117节描述了“SGR - 选择图形修饰”控制函数:
符号:(Ps...)
表示:CSI Ps... 06/13
参数默认值:Ps = 0
SGR用于为随后的文本建立一个或多个图形修饰方面。
根据第5.4节“控制序列”,控制函数由最终字节标识。表3“没有中间字节的控制序列的最终字节”还指出,代码06/13
表示SGR
控制函数。
看一下ASCII码表的第6列第13行:字符m
在这里(换句话说,代码为0x6d
的字符是m
)。
所以,这个想法是:SGR函数(管理文本外观)的代码是06/13。我们通过其代码调用此函数(按名称寻址函数是相当现代的概念;))。当将函数的代码视为字符代码时,函数的代码对应于字母m
。因此,您不需要编写所有这些数字,只需一个字母,非常方便:)
m
不是有意义的字母,它只是数字的替代。因此,您的问题应该是“为什么SGR函数的代码是06/13?”答案是:“请参阅上述表3。这是偶然的结果。”
[
)在7位代码或由位组合09/11在8位代码中表示。因此,在现代8位环境中,您可以摆脱转义,只需使用单个控制字符即可实现CSI:#!/usr/bin/env python3
CSI = '\x9b' # 09/11: Control Sequence Introducer
SGR = '\x6d' # 06/13: Select Graphic Rendition
P = '32' # green display
print(f'{CSI}{P}{SGR}Hello, green world!{CSI}0{SGR}')
这不是完全随意的,而是遵循委员会制定的方案,并在ECMA-48(与ISO 6429相同)中记录。除了最初的Escape字符外,后续字符由范围指定。
虽然广泛使用Escape[
这对组合符号(称为控制序列引导符CSI),但还有其他控制序列(例如Escape]
,操作系统命令OSC)。这些序列可能具有参数和一个最终字节。
m
是一个最终字节,它恰好告诉终端该序列应该做什么。如果给出参数,则是数字列表。另一方面,使用OSC,命令类型在开头,参数不太受限制(可以是任何可打印字符的字符串)。
]
和m
的值相差16个插槽所以才出现这种情况。 - Beefster