計算機編碼中的換行 CR與LF
以下的文字為轉載,但是有錯誤的地方,博主自行進行了修正和補充,用紅色標示。
原文地址在這裏。
------------ 轉載起始 -------------
“回車”(Carriage Return) 和 “換行”(Line Feed) 這兩個概念的來歷和區別。
1. 起源:電傳打字機
在計算機還沒有出現之前,有一種叫做電傳打字機(Teletype Model 33,Linux/Unix下的tty概念也來自於此)的玩意,每秒鐘可以打10個字符。但是它有一個問題,就是打完一行換行的時候,要用去0.2秒(註:估計是從打字機的最右邊回到最左邊的機械運動 所需要的時間),正好可以打兩個字符。要是在這0.2秒裏面,又有新的字符傳過來,那麽這個字符將丟失。
於是,研制人員想了個辦法解決這個問題,就是在每行後面加兩個表示結束的字符。
一個叫做“回車(Carriage Return)”,告訴打字機把打印頭定位在左邊界;
另一個叫做“換行(Line Feed)”,告訴打字機把紙向下移一行。
這就是“換行”和“回車”的來歷,從它們的英語名字上也可以看出一二。
2. 繼承:計算機
後來,計算機發明了,(因在計算機上編碼的需要),這兩個概念也就被搬到了計算機上。
3. 分歧:一個字符還是兩個字符
那時,存儲器很貴,一些科學家認為在每行結尾加兩個字符太浪費了,加一個就可以。於是,就出現了分歧。
- Unix系統裏,每行結尾只有“LF”,即”
\n
”; - Windows系統裏面,每行結尾是“CR/LF”,即“
\r/\n
\n/\r
”); - Mac系統裏,每行結尾是“CR”,即”
\r
”;
其中:
- CR 用符號
\r
表示, 十進制ASCII代碼是13, 十六進制代碼為0x0D; - LF 使用
\n
符號表示, ASCII代碼是10, 十六制為0x0A;
所以Windows平臺上換行在文本文件中是使用 0d 0a 兩個字節表示, 而UNIX和蘋果平臺上換行則是使用0a或0d一個字節表示.
4. 分歧的後果
一個直接後果是,Unix/Mac系統下的文件在 Windows裏打開的話,所有文字會變成一行;而Windows裏的文件在Unix/Mac下打開的話,在每行的結尾可能會多出一個^M
符號。
5. 不同系統相互之間的處理方式
一般操作系統上的運行庫會自動決定文本文件的換行格式. 如一個程序在windows上運行就生成CR/LF換行格式的文本文件,而在Linux上運行就生成LF格式換行的文本文件。在一個平臺上使用另一種換行符的文件文件可能會帶來意想不到的問題, 特別是在編輯程序代碼時. 有時候代碼在編輯器中顯示正常, 但在編輯時卻會因為換行符問題而出錯。很多文本/代碼編輯器帶有換行符轉換功能, 使用這個功能可以將文本文件中的換行符在不同格式單互換。
在不同平臺間使用FTP軟件傳送文件時,
- 在ascii文本模式傳輸模式下, 一些FTP客戶端程序會自動對換行格式進行轉換(Git傳輸的時候也會額)。經過這種傳輸的文件字節數可能會發生變化.。
- 如果你不想ftp修改原文件, 可以使用bin模式(二進制模式)傳輸文本。
------------ 轉載結束 -------------
以下為windows下notepad++編輯器的編輯截圖,設置顯示行尾符: 視圖->顯示符號->顯示行尾符。
計算機編碼中的換行 CR與LF