![为什么“回车”等特殊字符表示为“^M”?](https://linux22.com/image/1410998/%E4%B8%BA%E4%BB%80%E4%B9%88%E2%80%9C%E5%9B%9E%E8%BD%A6%E2%80%9D%E7%AD%89%E7%89%B9%E6%AE%8A%E5%AD%97%E7%AC%A6%E8%A1%A8%E7%A4%BA%E4%B8%BA%E2%80%9C%5EM%E2%80%9D%EF%BC%9F.png)
为什么^M
在 VIM 和其他上下文中用它来表示回车符?
我猜是M
拉丁字母的第 13 个字母,回车符是\x0D
或十进制13
。这是原因吗?这种表述有记录吗?
我注意到 Tab 用 表示^I
,这是拉丁字母表中的第九个字母。相反,Tab 是\x09
或十进制9
,这支持了我上面提出的理论。然而,这在哪里可以作为事实记录下来呢?
答案1
我认为楼主真正想问的是插入符号。
插入符号表示法是 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 之前。大多数情况下,编辑器默认设置包括“自动识别行尾”。
答案2
原因正是如此。
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)
传统上,这些字符是用Control所需字符相关的字母生成的。G出于这个原因,电传打字机和早期终端键盘在键上方写有“BELL”。
定义 ASCII 的标准文档是美国标准协会 X3.4-1963,由美国标准协会于 1963 年发布。我在他们的网站上找不到原始文件,但是这是原始文件的摘录显示字符表,包括上面的控制代码。
答案3
这种表示法可以追溯到最早的 ASCII 电传打字机(大约 1963 年)。有一个 CTRL 键可以切换 0x40 位,这样 CTRL-M(回车)将是 0D 而不是 4D,CTRL-G(铃声)将是 07 而不是 47,CTRL-L(换页)将是 0C 而不是 4C。
将特定字母分配给特定功能并没有“设计”,这只是一个偶然,当分配 ASCII 代码尘埃落定时,M 键与回车键有一点点不同,因此回车键变成了 CTRL-M。
这是我能找到的 ASR33 键盘的最佳照片。如您所见,控制字符名称以小字母形式印在相应的字母键上。
图像作者:Marcin Wichary,用户:AlanM1(源自(裁剪)文件:ASR-33 2.jpg)[CC BY 2.0],来自 Wikimedia Commons
M 键上没有注释,因为有一个专用的“RETURN”键,所以 CTRL-M 是多余的。
答案4
需要某种视觉方式来显示定义为不可打印的字符。
因此,20 世纪 70 年代初期(或许更早)的某个人(我记得在 CP/M 上看到过它,而且其他人已经提到过 TOPS)决定用“插入符号加字母”来表示 26 个不可打印的 ASCII 控制字符,其值为 1 到 26。值 0 打印为 ^@,值 127 打印为 ^?。