为什么将诸如“回车”之类的特殊字符表示为“ ^ M”?


93

为什么^M在VIM和其他情况下用来表示回车?

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

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


1
还请记住,DOS / Windows使用“ 0x0d 0x0a”,也称为“ CR LF”。但是unix / linux仅使用“ 0x0a”或“ LF”。因此,当您在linux中打开Windows文档时,它将检测到多余的“ CR”,而当您在Windows中打开linux文档时,则不会检测到新行。
LatinSuD 2014年

3
@LatinSuD脱字号(以及Ctrl键的相应使用)与C0控制集(ASCII的历史部分)直接相关,与给定的操作系统或程序是否以及如何使用该集的一部分来表示新行或其他任何内容无关其他。同样,^H删除字符还是允许套印(例如n^H~过时的生产ñ方式)或控制字符的其他任何实际使用都与插入符号分开。
乔恩·汉纳

11
旧的...我不记得原始代码了,但是ctrl-G响了!
Brian Drummond 2014年

3
@OlivierDulac否,则^ M 恰好一个回车,就像^ J是恰好一个换行。尽管不同的操作系统对于换行和/或回车还是其他东西有不同的看法(例如某些IBM字符使用的换行符,但不是ASCII的一部分,因此不属于某些其他操作系统的历史遗产)代表文本文件中的新行,尽管一些程序随后以不同的方式覆盖了它,但无论后来的Unix或DOS之类的操作系统决定采用哪种方式,U + 000D本身仍然是回车符。(当然,称呼它为
Jon Hanna

1
@OlivierDulac ... U + 000D很有用,因为该名称是在1990年代与Unicode一起出现的,但这确实可以引用1963年ASCII中存在的代码,以及1901年默里经修改的Baudot代码中存在的代码数十年来,Murray使用与“文本文件”概念相同的工具来解决与移动纸张有关的问题。将螺丝钉钉入钉子之类的东西,但它仍然是螺丝钉。使用LF和/或CR表示文本文件中一行的结尾,它们仍然是换行和回车符。
乔恩·汉纳

Answers:


115

我相信OP实际询问的是“ 插入符号”

脱字符号是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之前。大多数情况下,编辑器的默认设置包括“自动识别行尾”。


1
我一直想知道那东西叫什么...
smci 2014年

5
这个惯例至少可以追溯到1970年代。我第一次在TOPS-10操作系统上看到它,但它可能早已存在。值得一提的是,在较旧的ASCII终端上,现在显示为插入符号的字符实际上是一个向上的箭头,因此起源于“向上箭头”。
keshlam

15
这是显式地内置到ASCII设计,使Ctrl键就控制第7位
OrangeDog

2
它不仅用于字母。我不会将其定义为带有“字母的数值”的控制字符,而是“ xor 64”。换句话说,^Ais 0x41 xor 0x40或or 0x01and ^?is 0x3F xor 0x40或or 0x7F
R.,

1
Ascii DEL(^?)与删除键无关。它实际上是由<---类似VT100的终端上的按键(也称为退格键)生成的标准代码。
R.,

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)    

常规上,这些字符是用Control和所需字符相关的字母生成的。因此,电传打字机和早期的终端键盘在G键上方都写有“ BELL” 。

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


4
谢谢。尽管提供了信息,但该答案并不包含问题的答案。
dotancohen 2014年

1
答案隐藏在第二段中:^M是Control-M的简写。在终端上,您可以同时按Control键和M键以发送ASCII码kode 0x0D,也称为回车符。
Martin Liversage 2014年

14

该符号可以追溯到最早的ASCII Teletypes(大约1963年)。有一个CTRL键可切换0x40位,以便CTRL-M(回车)将是0D而不是4D,CTRL-G(钟形)将是07而不是47,CTRL-L(换页)将是0C 4C。

在为特定功能分配特定字母时没有“设计”,只是由于分配ASCII代码而使尘埃落定时,M键与回车键略有不同,因此回车键变成了CTRL-M,这是一个机会。

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

电传打字机型号33 ASR,带纸带打孔器/阅读器

图片由Marcin Wichary提供,用户:AlanM1(从File:ASR-33 2.jpg衍生(裁剪))[ CC BY 2.0 ],通过Wikimedia Commons

M键没有标记,因为有专用的“ RETURN”键,所以CTRL-M是多余的。


2
从某种程度上说,我们仍然受制于现在看来是古代系统的设计选择所约束的程度是非常令人惊讶的-我想是在反思中(a)不久之前,只是过渡时期的变化速度(b)如果做出了足够的设计决策,其中某些决策(尤其是那些不会给人们带来足够麻烦的决策)在它们消失的原因中必定会长期存在。回顾这些事情的历史仍然是一种奇怪的感觉。
Stuart Golodetz

2
@StuartGolodetz-实际上,我觉得这令人放心。但是后来我记得电传打字机是“先进技术”。(顺便说一下,Teletype ASR-33以其优雅的简洁性而著称。我只希望“现代”计算机系统设计得如此好。)
Daniel R Hicks

1
这很令人着迷,但是我不明白。.为什么他们决定这台打字机需要钟声?
CaptainCodeman 2014年

4
@CaptainCodeman-当您发送重要消息时,您将按铃以引起另一端操作员的注意。
Daniel R Hicks 2014年

2
有趣的是,Ctrl键在PC键盘上可以保留到今天。
Daniel R Hicks

3

插入号(^)只是编写的简写形式,按住Control键-CTRL向下即可。

在过去的好日子里,您可以直接输入这些代码(请参见上文),而Ctrl键+ G(^ G)将使终端变为“叮”

如果要在Vim中添加CR,请使用Ctrl键+ M等选项卡= Ctrl + I


您要查找的术语是digraph,这意味着两个字符代表一个字符。特别是,有向图和有向图用于表示不可打印的字符。从历史上看,它们还用于不出现在键盘上的字符,尽管对于现代的GUI和键盘,这已不再是一个大问题,所以这种用法比较陈旧。

如今仍然存在“过去的美好时光”,^ C和^ D完美地发挥了作用。^ G不再使终端响起的唯一原因是大多数终端仿真器都关闭了该响应。
SevenSidedDie14年

2

需要某种视觉方式来显示定义上不可印刷的字符。

因此,在1970年代初期(或更早)(有人记得我在CP / M上看到它,而其他人已经提到过TOPS)有人决定将“插入符号加字母”作为26个不可打印的ASCII控制字符的符号,并带有值1到26。将值0打印为^ @,将值127打印为^?。


1

它的记录位置在哪里,该页面列出了每个控制字符,以及如何使用控制键输入/表示它(尽管第一个,ASCII字符0,没有控制键表示),而对于字符127则没有任何内容。它在底部提供了源

https://www.cs.tut.fi/~jkorpela/chars/c0.html

假设存在33个控制字符(ASCII字符0-31,所以32个字符,+ 127个字符,所以,= 33个字符),怎么可能全部表示,因为字母表中只有26个字母。好吧,它对ASCII字符1使用Ctrl-A,对ASCII字符26使用Ctrl-Z,一旦到达Ctrl-Z,它就使用 [ \ ] ^ _

它在DOS中将Ctrl-Z列为SUB,尽管在DOS和cmd提示符下它是EOF,并且作为技术用户,您copy con a.aa.a将文件放在何处时使用它。您输入文本并用Ctrl-Z终止,这很有趣,它没有输入EOF标记。但是确实告诉CMD这是文件的末尾,因此CMD会将其写入。

该cs.tut.fi网页将其作为来源
http://www.wps.com/texts/codes/X3.4-1963/index.html

但这是一个损坏的链接,但可以在archive.org上以JPG的形式使用

美国信息交换标准代码
ASA标准X3.4-1963

https://web.archive.org/web/20010430085116/http://www.wps.com/texts/codes/X3.4-1963/index.html


大多数控制字符是没有意义的,但即使是某些具有Ctrl-I之类含义的字符,我也不确定在哪里可以执行Ctrl-I并获得制表符。
barlop 2014年

1
没有任何控制字符是没有意义的。在许多情况下,它们中的许多未使用,但是每个单个都有至少一种含义。
乔恩·汉纳

@JonHanna当然,我并不是说它们毫无意义(过去时)。但是R.已经几十年没有意义了,即它们从几代前就具有其原始含义,不再运行的技术如今(大多数字符)已变得毫无意义。带有当前甚至稍微有些陈旧的技术,如果将其用于现代用途的话,它的数量并不多。en.wikipedia.org/wiki/Control_character上 有一个常用的列表,分别为0、7、8、9、10、11、12、13、127。9/33,所以其他人(其中24个)要么很少要么根本不做,因为它们像数十年前未使用的
滑稽旧

美联社仍然使用ANPA-1312,它使用1-4、6和16来启动每个TCP / IP连接。现代打印机(以及其他打印机)仍然使用17和19。与您提到的打印机一起,我们相当一部分都没有真正尝试过。我会保证它们没有被大量使用,但是它们也没有死。
乔恩·汉纳

1
@barlop您可以^I在标准bash中键入一个选项卡:输入ls ~/^I^I,您应该会在主目录中看到所有文件夹。
wchargin 2014年

0

您可以Control表中看到所有不可定价的ASCII字符映射。


5
虽然从理论上讲这可以回答问题,但最好在此处包括答案的基本部分,并提供链接以供参考。这样,如果链接的页面由于任何原因发生更改或变为无效,答案对于超级用户的访问者仍然有用。
2014年

3
谢谢。尽管提供了信息,但该答案并不包含问题的答案。
dotancohen 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.