題 為什麼特殊字符如“回車”表示為“^ M”?


為什麼是 ^M 用於表示VIM和其他環境中的回車? 

我的猜測是 M 是拉丁字母的第13個字母,回車符是 \x0D 或小數 13。這是什麼原因? 這種表示是否記錄在何處?

我注意到Tab表示為 ^I,這是拉丁字母的第九個字母。相反,Tab是 \x09 或小數 9,這支持了我上面提到的理論。但是,這可能被記錄為事實?


91
2018-06-05 08:31


起源


還要記住,dos / windows使用“0x0d 0x0a”,也稱為“CR LF”。但是unix / linux只使用“0x0a”或“LF”。因此,當您在Linux中打開一個Windows文檔時,它會檢測到額外的“CR”,當您在Windows中打開一個linux文檔時,它不會檢測到新行。 - LatinSuD
@LatinSuD插入符號(以及Ctrl鍵的相應用法)直接與C0控件集(歷史上是ASCII的一部分)有關,而不是給定操作系統或程序是否以及如何使用該集合的一部分來表示新行或任何內容其他。同樣,是否 ^H刪除字符或允許疊印(例如 n^H~ 作為一種過時的方式來生產ñ)或任何其他實際的 使用 控製字符與插入符號分開。 - Jon Hanna
舊的......我記不起原代碼了,但是ctrl-G響了! - Brian Drummond
@OlivierDulac不,^ M 是 完全是一個回車,就像^ J正是一個換行符。雖然不同的操作系統對換行和/或回車或其他東西(如某些IBM字符使用的換行符但不是ASCII的一部分,因此不是某些其他操作系統的歷史遺產的一部分)有不同的看法代表一個文本文件中的新行,雖然有些程序以不同的方式覆蓋了它,但是U + 000D本身仍然是一個回車符,無論後來的操作系統如Unix或DOS決定用它做什麼。 (當然,稱之為...... - Jon Hanna
@OlivierDulac ... U + 000D是普通的,因為這個名字在20世紀90年代附帶了Unicode,但它確實引用了1963年在ASCII中存在的代碼,因為它存在於1901年的Murray修改的Baudot代碼中穆雷正在解決與移動紙張有關的問題,幾十年後使用“文本文件”概念中使用的相同工具。將螺絲擰成釘子之類的東西,它仍然是一個螺絲釘。使用LF和/或CR表示文本文件中行的結尾,它們仍然是換行符和回車符。 - Jon Hanna


答案:


我相信OP實際上在詢問的是什麼 Caret表示法

插入符號是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之前。大多數情況下,編輯器默認設置包括“自動識別行結束”。


114
2018-06-05 09:12



我總是想知道那件事叫什麼...... - smci
這個慣例至少可以追溯到1970年代;我第一次在TOPS-10操作系統上看到它,但它可能早就存在了。對於它的價值,在舊的ASCII終端上,現在顯示為插入符號的字符實際上是向上箭頭,因此這起源於“uparrow notation”。 - keshlam
這顯然內置於ASCII設計中,因此Ctrl鍵只需切換第7位。 - OrangeDog
它不僅用於字母。我不會將它定義為帶有“字母數字值”的控製字符,而是“xor 64”。換一種說法, ^A 是 0x41 xor 0x40, 要么 0x01 和 ^? 是 0x3F xor 0x40, 要么 0x7F。 - R..
Ascii DEL(^?)與刪除鍵無關。它實際上是由生成的標準代碼 <--- 類似VT100的終端上的密鑰(也稱為混淆,稱為退格)。 - R..


這正是原因所在。

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)    

通常這些字符是用這些字符生成的 控制 以及與所需角色有關的信件。 Teletypes和早期的終端鍵盤上面寫著'BELL' G 關鍵是這個原因。

定義ASCII的標准文檔是 ASA X3.4-1963這是由美國標準協會於1963年出版的。我在他們的網站上找不到原始文件,但是 這個摘自原始文件 顯示字符表,包括上面的控制代碼。


22
2018-06-05 08:38



謝謝。雖然信息豐富,但這個答案並不包含問題的答案。 - dotancohen
答案隱藏在第二段中: ^M 是Control-M的簡寫。在終端上,您可以按住Control鍵和M鍵一起發送ASCII kode 0x0D,也稱為回車符。 - Martin Liversage


符號可以追溯到最早的ASCII Teletypes(ca 1963)。有一個CTRL鍵切換0x40位,以便CTRL-M(回車)將是0D而不是4D,CTRL-G(鐘)將是07而不是47,CTRL-L(換頁)將是0C而不是4C

在為特定函數分配特定字母時沒有“設計”,只是當通過分配ASCII碼確定灰塵時,M鍵與回車不同,因此回車變為CTRL-M。

這是我能找到的ASR33鍵盤的最佳鏡頭。如您所見,控製字符名稱在相應的字母鍵上以小寫字母打印。

Teletype Model 33 ASR with paper tape punch/reader

圖片 作者:Marcin Wichary,用戶:AlanM1(Derived(cropped)from File:ASR-33 2.jpg)[CC BY 2.0],通過Wikimedia Commons

M鍵上沒有符號,因為有一個專用的“RETURN”鍵,因此CTRL-M是多餘的。


13
2018-06-06 22:01



在某種程度上,我們仍然受到現在看起來像古代系統的設計選擇的約束程度是相當令人驚訝的 - 我想反思(a)它不是很久以前,它只是在過渡時期的變化速度令人驚訝的是,(b)如果做出足夠的設計決定,其中一些(特別是不會引起人們足夠問題的那些)必然會在它們消失的記憶中消失很久。回顧一些這些東西的歷史仍然是一種奇怪的感覺。 - Stuart Golodetz
@StuartGolodetz - 實際上,我覺得奇怪的讓人放心。但後來我記得Teletypes是“先進技術”。 (順便說一句,Teletype ASR-33因其優雅的簡潔性而引人注目。我只希望“現代”計算機系統設計得很好。) - Daniel R Hicks
這很有意思,但我不明白的是......為什麼所有的事情都決定了這台打字機需要一個鐘? - CaptainCodeman
@CaptainCodeman - 當你發送一條重要信息時,你會響鈴,以引起另一端操作員的注意。 - Daniel R Hicks
值得注意的是,Ctrl鍵在PC鍵盤上存活至今。 - Daniel R Hicks


插入符號(^)只是寫入控制鍵 - CTRL的簡寫。

在過去的好日子裡,您可以直接輸入這些代碼(見上文),Ctrl鍵+ G(^ G)會使終端變為“ding”

如果要在Vim中添加CR,請使用Ctrl鍵+ M等選項卡= Ctrl + I.


2
2018-06-06 14:32



你正在尋找的術語是 有向圖,表示代表一個字符的兩個字符。具體來說,有向圖和三字母用於表示不可打印的字符。從歷史上看,它們也被用於沒有出現在鍵盤上的字符,儘管使用現代GUI和鍵盤這不是一個問題,因此這種使用更加古老。
“在過去的美好時光”仍然是今天,^ C和^ D完全正常運作。 ^ G不再使終端ding的唯一原因是大多數終端仿真器都關閉了該響應。 - SevenSidedDie


需要一些可視化的方式來顯示定義​​不可打印的字符。

因此,有人在20世紀70年代早期(或者更早)(我記得在CP / M上看到它,而其他人已經提到TOPS)決定“插入符號加上字母”將成為26個不可打印的ASCII控製字符的符號值1是/被打印為^ @,值127被打印為^?。


2
2018-06-09 00:51





它在哪裡記錄,這個頁面列出了每個控製字符,如何用控制鍵輸入/表示它(雖然第一個,ascii字符0,沒有控制鍵表示),它沒有字符127的任何內容。它提供了底部的來源

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

有人可能會想,因為有33個控製字符(ASCII字符0-31所以32個字符,+字符127.所以,= 33個字符)它們將如何表示,因為字母表中只有26個字母。好吧,它使用Ctrl-A表示Ascii字符1,Ctrl-Z表示ascii字符26,一旦它到達Ctrl-Z,它使用 [  \  ]  ^  _ 

它將Ctrl-Z列為SUB,但在DOS和cmd提示符下它是EOF,作為技術用戶,你在做的時候使用它 copy con a.a 哪裡 a.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


1
2018-06-05 18:25



大多數控製字符都沒有意義,但即使是一些像Ctrl-I這樣的意思,我也不知道你在哪裡可以做Ctrl-I並得到一個標籤。 - barlop
沒有一個控製字符是沒有意義的。其中許多在許多情況下都沒有使用,但每一個都至少有一個含義。 - Jon Hanna
@JonHanna當然我並不是說它們毫無意義(過去時)。但是R.Have幾十年來一直沒有意義,即他們從很久以前就有了自己的意義,不再運行的技術,(大多數的chars)今天毫無意義當前甚至略顯陳舊的技術如果有任何現代用途,它並不多。這裡有一個清單 en.wikipedia.org/wiki/Control_character  常用的0,7,8,9,10,11,12,13,127。 9/33所以其他人(其中24個人)你或者很少或者根本不會因為他們使用了數十年的機械裝置而未使用 - barlop
美聯社仍然使用ANPA-1312,它使用1-4,6和16來啟動每個TCP / IP連接。現代打印機(以及其他產品)仍然使用17和19.與你提到的那些一起,我們相當一部分被覆蓋而沒有真正嘗試。我會告訴你他們不在 重 使用,但他們也沒有死。 - Jon Hanna
@barlop你可以做到 ^I 對於標準bash中的選項卡:type ls ~/^I^I 並且您應該看到主目錄中的所有文件夾。 - wchargin


您可以看到所有不可引用的ASCII字符 控制 映射 這個 表。


0
2018-06-05 08:46



雖然理論上這可以回答這個問題, 這會更好 在這裡包括答案的基本部分,並提供參考鏈接。這樣,如果鏈接頁面由於任何原因而發生變化或變得無效,則答案仍然對超級用戶的訪問者有用。 - α CVn
謝謝。雖然信息豐富,但這個答案並不包含問題的答案。 - dotancohen