【问题标题】:Why must I use \x1b not \ to represent an escape character为什么我必须使用 \x1b 而不是 \ 来表示转义字符
【发布时间】:2019-05-24 00:54:22
【问题描述】:

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

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

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

【问题讨论】:

  • 两个不同的转义字符代表两个完全不同的东西。
  • 你能说得更具体点吗?
  • \x1b 代表一个 ESC 字符 - 查看 ASCII 图表。 \ 是一个反斜杠,C 编译器使用它来转义字符。 ESCescape character 不同。该代码行输出ESC 字符,后跟一系列其他三个字符 ([23),总共 4 个字符。
  • 转义字符和ESC字符有什么区别?
  • “转义字符”是一个通用概念。 ESC 是说明符 ASCII 值:27。

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


【解决方案1】:

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

虽然ASCII escape character\x1B,而n\x6E,但无法使用\x1B\x6E\n 字符插入到字符串中,原因有两个:

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

  2. 编程语言搜索\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。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-25
      • 1970-01-01
      • 1970-01-01
      • 2016-01-16
      • 2013-02-27
      相关资源
      最近更新 更多