【詳解】回車 換行 0x0D 0x0A CR LF \r \n的前因後果

一、【回車和換行的歷史】

在計算機尚未出現以前,有一種叫作電傳打字機(Teletype Model 33)的玩意,每秒鐘能夠打10個字符。可是它有一個問題,就是打完一行,須要回車換行,此過程,要用去0.2秒,正好能夠打兩個字符。要是在這0.2秒裏面,又有新的字符傳過來,那麼這個字符將丟失。 php

因而,研製人員想了個辦法解決這個問題,就是在每行後面加兩個表示結束的字符。一個叫作「回車」,告訴打字機把打印頭定位在左邊界;另外一個叫作「換行」,告訴打字機把紙向下移一行。 html

 二、【關於回車和換行的更詳細的解釋】

首先,打字機打完一行,意味着,從左到右把一行的字打完了,此時打印機的打印頭處於最右邊,因此,想要繼續打字,須要(1)將把打印頭移動到最左邊,而後(2)打字所用的紙張,換到下一行。 linux

而(1)打印頭移動到最左邊的動做,稱之爲回車; shell

2)打字所用的紙張換到下一行,稱之爲換行。其是經過打字機的滾筒滾動,將紙向前滾動,就至關於打印頭換了一行,處在新一行的最左邊的開始的位置了,即所謂的走紙。 express

這就是「回車」和「換行」的來歷,從它們的英語名字上也能夠看出一二。 windows

對應到計算機系統中: app

回車:將當前光標移動到同一行中的最左邊(假設是從左到右的輸入方式) 編輯器

換行:保持當前光標的水平位置位置不變,換到下一行。 工具

所以,將回車和換行聯合起來,纔是咱們所常理解的含義: 測試

輸入完一行後,回車換行到下一行,即光標不只僅是回到了最左邊,並且也換到了下一行。

三、【不一樣系統中表示回車換行含義所用字符不一樣】

後來,計算機發明瞭,這兩個概念也就被般到了計算機上。那時,存儲器很貴,一些科學家認爲在每行結尾加兩個字符太浪費了,加一個就能夠。因而,就出現了分歧。

不一樣的系統裏面,對於一樣一個回車換行的含義,所用的字符不一樣:

Table 1 不一樣系統中回車換行對應的字符

系統類型

回車換行所用字符

Linux/Unix

\n = Newline = 0x0A = 10 = LF =Line Feed = 換行 = Ctrl + J

Mac

\r = Return = 0x0D = 13 = CR = Carriage Return = 回車 = Ctrl + M

Windows/Dos

\r \n = 0x0D 0x0A = CR LF = 回車 換行

 

提示:

1. 對應的,在Linux中經過鍵盤輸入Enter回車鍵,輸入的是\n=0x0A, Windows中的Enter鍵則是輸入的是0x0D 0x0A

2.其中關於0x0A對應的着Ctrl + J0x0D對應着Ctrl + M等等相關的ASCII的控制字符及輸入方式,可參見:

ASCII字符集中的功能/控制字符

http://www.crifan.com/files/doc/docbook/char_encoding/release/html/char_encoding.html#ascii_ctrl_char

3.後來看到How to use regular expressions in Notepad++ (tutorial)中的解釋得知,原來Mac 9及以前版本,是用EOL字符做爲換行符的,OSX及以後,纔開始用\n表示換行。

四、【因爲回車換行在不一樣系統中所用不一樣字符所致使的問題及解決辦法】

1. Linux中打開Windows中的文件

因爲Linux用\n=0x0A=10=LF來表示換行,因此,打開Windows中的文件的時候,若是其中有換行,即其中有\r \n= 0x0D 0x0A,此時,就會被處理爲,只將n理解爲換行,而把r看做爲一個單獨的字符,此r字符,對應ASCII的值是0x0D=13,是個控制字符,對應的是用Ctrl+M=一個Ctrl加上一個大寫的M字符,在Linux中的文本編輯器中,如Vi中,對應顯示爲一個「^M「。

 解決辦法:

1Linux下,用命令:

tr-d"15"< myfile.txt > myfile_new.txt



將其中^M去除掉。其中15中的015是八進制的15=十進制的13=十六進制的0x0D

2)或者用dos2unix工具處理:

dos2unix file_name



詳情參見:

【整理】如何取消Linux下,vi中顯示的^M符號

http://www.crifan.com/order_how_to_cancel_under_linux_vi__m_symbol_in_the_display/

2. Mac中打開Windows中的文件

同理,Mac中打開Windows中的文件,若是有回車換行的話,只會識別其中的\r=0x0D,而將餘下的\n=0xA=LF當作一個單獨的字符,顯示出「^J」。

3. Windows中打開MacLinux中的文件

通過測試,發現,在windows中,估計把原先的0x0D 0x0A去掉其中任何一個的話,而後用windows下的文本類編輯器再去打開,發現:

除了最簡單的Windows自帶的Notepad,沒法正常識別回車換行,內容被顯示到同一行中以外;其餘一些編輯器,如Notepad2Notepad++Windows自帶的記事本WordPad,均可以正常識別成回車換行,不會將內容都輸出在同一行。

對應的,也能夠經過Notepad++來實如今Linux,Windows,Mac這三種格式中來回轉換,詳情參考:

Notepad++中Windows,Unix,Mac三種格式之間的轉換

http://www.crifan.com/files/doc/docbook/crifan_rec_soft/release/html/crifan_rec_soft.html#npp_func_windows_unix_mac

五、【引用】

1.  回車與換行的故事

http://huangyunbin.iteye.com/blog/1112171

2. Carriage return

http://en.wikipedia.org/wiki/Carriage_return

3. 回車和換行的區別

http://bbs.chinaunix.net/thread-393307-1-1.html

4. 回車和換行有什麼區別?咱們平時按下的Enter鍵是回車仍是換行?[原創]

http://www.52rd.com/blog/Detail_RD.Blog_imjacob_12317.html

5. 【整理】回車(\r, return, CR, Carriage Return)和換行(\n, newline, LF, Line Feed)有什麼區別

http://www.crifan.com/order_return__r_return_cr_carriage_return_and_line_feed__n_newline_lf_line_feed_what_is_the_difference/

相關文章
相關標籤/搜索