【问题标题】:How to enter/input special char ETB(ASCII 23) as a char in terminal?如何在终端中输入/输入特殊字符 ETB(ASCII 23)作为字符?
【发布时间】:2019-08-31 09:48:43
【问题描述】:

如何在Linux终端输入/输入EOT(End of Trans)(ASCII 23)?

每次我使用alt + 23输入时,我之前输入的所有字符都会被清除。

例如,输入ikl后,如果按上述方法输入EOT,则所有字符串都是干净的。

【问题讨论】:

  • 我投票结束这个问题,因为它属于 unix.stackexchange.com
  • 恕我直言,内容值得社区迁移到 SU。我投票决定重新开放,以便社区迁移到 SU。
  • 可能是与终端输出相关的普通C编程问题。

标签: c linux terminal ascii


【解决方案1】:

在终端窗口或文本控制台中输入的字符在到达提示输入的 C 代码之前要经过许多层的解释。

如果您使用getc() 从用户那里读取字符,或者更准确地说是字节,他们执行的最后一步是缓冲,这可以通过setvbuf() 进行控制。

当这些字节来自终端时,终端设备处理程序会执行一个额外的缓冲步骤,从简单的退格处理到更精细的行编辑功能,以及处理信号(Ctrl-C Ctrl-ZCtrl-\...)。大多数终端将处理emacs 的行编辑绑定:Ctrl-A 行首,Ctrl-E 行尾,Ctrl-K 终止行尾,Ctrl-Y yank (paste)... 尽管不是 emacs 绑定 Ctrl-W 用于 kill-word-backward。

因此,如果没有一些特定的解决方法,您无法在终端提示符下键入 Ctrl-W 输入 ASCII 23 (EOT):

  • 您可以使用tcsetattr() 将终端设置为原始模式,使每个字节在用户键入时可供程序使用,无论是否在标准流中缓冲。
  • 用户可以在Ctrl-W之前输入Ctrl-V来告诉终端设备驱动绕过 Ctrl-W 组合键的处理。

在这两种情况下,在终端窗口中键入的字符可能需要换行符才能用于待处理的getc()

【讨论】:

    【解决方案2】:

    ASCII 23 是 CTRL-W,在许多情况下是“删除单词”。

    确切的答案取决于终端处于何种输入模式,如果终端处于原始模式,则最终由哪个程序解释输入。如果它处于熟模式,或者处于带有典型 shell(如 bash)的原始模式,则在输入前加上 CTRL-V(或 stty -alnext 报告的任何内容)应该可以解决问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多