为什么“回车”等特殊字符表示为“^M”?

dot*_*hen 94 terminal encoding special-characters

为什么^M在 VIM 和其他上下文中用于表示回车?

我的猜测是这M是拉丁字母表的第 13 个字母,回车是\x0D或小数13。这是原因吗?此表示是否记录在任何地方?

我注意到 Tab 由 表示^I,它是拉丁字母表的第九个字母。相反, Tab is \x09or decimal 9,这支持我上面提到的理论。但是,这可以在哪里记录为事实?

Art*_*ner 118

我相信 OP 实际问的是什么叫做Caret Notation

插入符号是 ASCII 编码中不可打印控制字符的符号。符号由插入符号 (^) 后跟一个大写字母组成;这个有向图代表 ASCII 码,其数值等于字母的数值。例如,值为 4 的 EOT 字符表示为 ^D,因为 D 是字母表中的第 4 个字母。值为 0 的 NUL 字符表示为 ^@(@ 是 A 之前的 ASCII 字符)。值为 127 的 DEL 字符通常表示为 ^?,因为 ASCII '?' 在 '@' 之前,如果屏蔽为 7 位,则 -1 与 127 相同。翻译的另一种表述是通过反转 ASCII 代码的第 7 位找到打印的字符

可以在此处找到 ASCII 控制字符的完整列表以及插入符号

关于 vim 和其他文本编辑器:如果在需要 Linux 行尾 (LF) 的编辑器中打开 Windows 格式 (CRLF) 文本文件,通常只会看到 ^M。0x0A 被渲染为换行符,0x0D 就在它被打印为 ^M 之前。大多数时候,编辑器的默认设置包括“自动识别行尾”。

  • 这是明确内置在 ASCII 设计中的,因此 Ctrl 键只是切换第 7 位。 (15认同)
  • 这个约定至少可以追溯到 1970 年代;我第一次在 TOPS-10 操作系统上看到它,但它很可能更早存在。值得一提的是,在较旧的 ASCII 终端上,现在显示为插入符号的字符实际上是一个向上的箭头,因此它起源于“向上箭头符号”。 (5认同)
  • 我一直想知道那个东西叫什么... (2认同)
  • 它不仅仅用于字母。我不会将它定义为带有“字母的数值”的控制字符,而是“xor 64”。换句话说,`^A` 是`0x41 xor 0x40`,或者`0x01`,而`^?` 是`0x3F xor 0x40`,或者`0x7F`。 (2认同)

Flu*_*lup 22

这正是原因。

ASCII 将字符 0-31 定义为非打印控制代码。以下是ascii(7)来自随机 Linux 系统 ( man ascii)的手册页的摘录,直到并包括 CR (13):

   Oct   Dec   Hex   Char                       
   ?????????????????????????????????????????????
   000   0     00    NUL '\0'                    
   001   1     01    SOH (start of heading)     
   002   2     02    STX (start of text)         
   003   3     03    ETX (end of text)           
   004   4     04    EOT (end of transmission)   
   005   5     05    ENQ (enquiry)               
   006   6     06    ACK (acknowledge)           
   007   7     07    BEL '\a' (bell)             
   010   8     08    BS  '\b' (backspace)       
   011   9     09    HT  '\t' (horizontal tab)  
   012   10    0A    LF  '\n' (new line)        
   013   11    0B    VT  '\v' (vertical tab)    
   014   12    0C    FF  '\f' (form feed)       
   015   13    0D    CR  '\r' (carriage ret)    
Run Code Online (Sandbox Code Playgroud)

按照惯例,这些字符是用Control与所需字符相关的字母生成的。G由于这个原因,电传打字机和早期的终端键盘在键上方写有“BELL” 。

定义 ASCII 的标准文档是ASA X3.4-1963,是美国标准协会在 1963 年发布的。我在他们的网站上找不到原始文档,但是这个原始文档的摘录显示了字符表,包括上面的控制代码。

  • 谢谢你。尽管提供了信息,但此答案不包含问题的答案。 (4认同)

Dan*_*cks 14

该符号可以追溯到最早的 ASCII 电传打字机(约 1963 年)。有一个 CTRL 键可以切换 0x40 位,因此 CTRL-M(回车)将是 0D 而不是 4D,CTRL-G(响铃)将是 07 而不是 47,CTRL-L(换页)将是 0C 4C。

将特定的字母分配给特定的功能并没有“设计”,这只是偶然的,当分配 ASCII 代码尘埃落定时,M 键与回车有一点不同,因此回车变成了 CTRL-M。

这是我能找到的 ASR33 键盘的最佳照片。如您所见,控制字符名称以小写字母打印在相应的字母键上。

带纸带打孔器/阅读器的电传打字机 Model 33 ASR

图片由 Marcin Wichary 提供,用户:AlanM1(源自(裁剪)自File:ASR-33 2.jpg)[ CC BY 2.0 ],来自 Wikimedia Commons

M 键上没有符号,因为有一个专用的“RETURN”键,所以 CTRL-M 是多余的。

  • @CaptainCodeman - 当您发送重要消息时,您会按铃以引起另一端接线员的注意。 (4认同)
  • 在某种程度上,我们仍然受到为现在看起来古老的系统所做的设计选择所束缚的程度是相当令人惊讶的 - 我想在反思中 (a) 不是很久以前,只是过渡时期的变化速度一直令人惊讶,并且(b)如果做出了足够的设计决策,其中一些(尤其是那些不会给人们带来足够问题的决策)必然会在它们的原因消失在记忆中很久之后仍然存在。尽管如此,回顾其中一些事情的历史仍然有一种奇怪的感觉。 (2认同)
  • @StuartGolodetz - 实际上,我觉得奇怪地让人放心。但后来我记得当电传打字机是“先进技术”时。(顺便说一下,电传打字机 ASR-33 以其优雅的简单性而著称。我只希望“现代”计算机系统也设计得很好。) (2认同)
  • 有趣的是,Ctrl 键在 PC 键盘上一直存在至今。 (2认同)