2

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

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

清除屏幕。为什么不'\[2J'做作业?

4

2 回答 2

3

虽然这个问题有点老了,但我会以我的两分钱\n为例。

尽管ASCII escape character is\x1Bnis \x6E,但无法使用 将\n字符插入字符串\x1B\x6E,原因有两个:

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

  2. 编程语言在源代码中搜索\n(作为单个实体)(在我们处于字节级别之前)将其转换为换行字节,因此不会被转换为任何内容。因此,即使您在源代码中使用(一个 ASCII和一个 ASCII ),它也不会被转换为换行符。\x1B\x6E \x5C\x6E\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。

于 2020-05-08T22:55:09.250 回答
1

稍微详细说明一下 Ken 和 Jonathan 的评论: Escape here 是一个一般概念。它基本上意味着改变某事的解释。ASCII 中的转义字符起源于电传打字机,其中 ESC 的出现改变了对后面字符的解释。许多终端以相同的方式使用它。例如,在字符串前出现 ESC[2J导致字符串(即字符[2J)在终端不显示,而是解释为命令清除整个屏幕”。因此,转义字符改变了解释模式

但是,没有直接的方法可以输入 ASCII 转义字符(因为在键盘上按 ESC 键通常会更改编辑器、终端或其他任何东西中的模式),即使可以,语言 C 的允许字符集也不会不包括它。现在,您需要第二级转义:C 有自己的转义字符:\。它改变了下一个字符的含义。例如,前面的反斜杠将后面字符的含义(解释)更改n为换行符。此外,\x(或\0,分别)让 C 解析器将以下两(三)个字符解释为十六进制(八进制)数字 - 而不是字符本身 - 并插入与该代码号相对应的字符。由于转义的 ASCII 代码分别具有数字 27(十进制)或 1b(十六进制)或 33(八进制),因此您可以通过\x1b或生成 C 中的 ASCII 转义字符\033

换句话说,您在 C 中转义\以生成 ASCII 转义字符,这反过来又会在您的终端强制转义。

于 2019-05-24T08:18:02.267 回答