为什么必须使用\ x1b而不是\来代表转义字符

时间:2019-05-24 00:54:22

标签: c escaping control-characters low-level-io

我已经读过\x1b代表转义字符,但是'\'本身不是转义字符吗?教程要我写

write(STDOUT_FILENO, "\x1b[2J", 4);

以清除屏幕。为什么'\[2J'不做这项工作?

2 个答案:

答案 0 :(得分:0)

稍微阐述一下Ken和Jonathan的评论:在此处转义是一个总的概念。它基本上意味着事物解释的改变。 ASCII中的转义字符起源于电传打字机,其中ESC的出现改变了对以下字符的解释。许多终端以相同的方式使用它。例如,在字符串[2J导致字符串(即字符[2J之前,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,有两个原因:

  1. ASCII表中的ESC字符和编程语言中的转义字符\是两个不同的东西。

  2. 编程语言在源代码中搜索\n(作为一个实体)(在字节级别之前)将其转换为换行字节,因此\x1B\x6E 将不会转换为。因此,即使您在源代码中使用\x5C\x6E(ASCII \和ASCII n),也不会将其转换为换行符。

    < / li>

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。