我已经读过\x1b
代表转义字符,但是'\'
本身不是转义字符吗?教程要我写
write(STDOUT_FILENO, "\x1b[2J", 4);
以清除屏幕。为什么'\[2J'
不做这项工作?
答案 0 :(得分:0)
稍微阐述一下Ken和Jonathan的评论:在此处转义是一个总的概念。它基本上意味着事物解释的改变。
ASCII中的转义字符起源于电传打字机,其中ESC的出现改变了对以下字符的解释。许多终端以相同的方式使用它。例如,在字符串[2J
导致字符串(即字符[
,2
和J
之前,ESC的外观未显示终端上的“ strong>”,但被解释为“ 清除整个屏幕”。因此,转义字符更改了解释模式。
但是,没有直接的方法可以输入ASCII转义字符(因为在键盘上按ESC键通常会在编辑器,终端或其他任何方式中更改模式),即使可以,也可以输入允许的字符集。语言C不包含它。现在,您需要第二级转义:C具有自己的转义字符:\
。它更改了下一个字符的含义。例如,前面的反斜杠会将后继字符n
的含义(解释)更改为换行符。此外,\x
(或分别为\0
)使C解析器将以下两个(三个)字符解释为十六进制(八进制)数字-而不是字符本身-并插入对应的字符那个代码号。由于用于转义的ASCII码分别具有数字27(十进制)或1b(十六进制)或33(八进制),因此您可以用\x1b
或\033
在C中生成ASCII转义字符。 / p>
换句话说,您使用\
在C中进行转义以生成ASCII转义字符,进而迫使您在终端中进行转义。
答案 1 :(得分:0)
尽管这个问题有点老了,但我将以\n
为例给出两分钱。
尽管ASCII escape character
是\x1B
,而n
是\x6E
,但是不可能在字符串中插入\n
字符之所以使用\x1B\x6E
,有两个原因:
ASCII表中的ESC
字符和编程语言中的转义字符\
是两个不同的东西。
编程语言在源代码中搜索\n
(作为一个实体)(在字节级别之前)将其转换为换行字节,因此\x1B\x6E
将不会转换为。因此,即使您在源代码中使用\x5C\x6E
(ASCII \
和ASCII n
),也不会将其转换为换行符。
Python示例:
>>> print("Hello\x5C\x6EWorld")
Hello\nWorld
# if one still insists on inserting a new line using an ascii line-feed (\x0A), they can do:
>>> print("Hello\x0AWorld")
Hello
World
HTH。