作為程序員,在處理文件和輸入輸出的時候經常要跟CRLF和LF打交道。可能大家多少知道一些,但總是記不清楚,我也是這樣的,因此寫下這篇博文,作為記錄。
首先,明確他們的意思:CR(回車),LF(換行)。是不是有點別扭,有點難記?下面的趣談能幫助大家記憶:
CR和LF是縮寫,其實他們的全稱分別是:"Carriage-Return"和"Line-Feed"。追本溯源的說,CR(Carriage-Return)和LF(Line-Feed)這兩個詞來源於打字機的發明和使用。

如果大家看過故事背景比較老的電影或者電視劇,那么對這個家伙如何工作會有一定的印象:當你用一個打字機的時候,asdfghjkl;'右邊的那個按鈕(在計算機鍵盤上,就對應着Enter鍵)被按下的時候,打字機的紙張卷動一行,而紙張的水平位置並不變化。打字機上另外還有一個手柄,那個手柄是專用來回車的,向左搬動那個手柄的時候,裝紙的結構被松開,在彈簧的作用下彈回最右邊(相當於打印頭回到最左邊)。所以當我們要換行的時候,實際需要兩步操作,回車+換行(或者反過來)。
因此,打字機的紙張卷動一行,就是換行(LF, Line-Feed),再看看這個單詞,有沒有覺得很形象?Line-Feed就是往打字的地方“喂”了一行。
而將打印頭從最右邊歸為到最左邊,就是回車(CR, Carriage-Return),其實單詞的字面意思就是“倒(馬)車”嘛,真的很形象!有人可能會問,為什么CR里的"C"是"Carriage(馬車)"而不是"Car(汽車)"呢?
因為打字機發明的時候,汽車還沒發明嘛!
言歸正傳,為什么我們會遇到各種關於CRLF的問題呢?
在文本處理中, CR, LF, CR/LF是不同操作系統上使用的換行符.
Dos和windows采用回車+換行CR/LF表示下一行,
而UNIX/Linux采用換行符LF表示下一行,
蘋果機(MAC OS系統)也采用換行符LF表示下一行。(注:有些人認為Mac Style是CR,我查了一些資料,發現應該是這樣的:老的Mac是CR,后來的OSX全部改成了LF)
CR用符號’\r’表示, LF使用’\n’符號表示。
一般操作系統上的運行庫會自動決定文本文件的換行格式。 如一個程序在windows上運行就生成CRLF換行格式的文本文件,而在Linux上運行就生成LF格式換行的文本文件。
在一個平台上使用另一種換行符的文件文件可能會帶來意想不到的問題, 特別是在編輯程序代碼時. 有時候代碼在編輯器中顯示正常, 但在編輯時卻會因為換行符問題而出錯。
很多文本/代碼編輯器帶有換行符轉換功能, 使用這個功能可以將文本文件中的換行符在不同格式單互換。
在不同平台間使用FTP軟件傳送文件時, 在ascii文本模式傳輸模式下, 一些FTP客戶端程序會自動對換行格式進行轉換. 經過這種傳輸的文件字節數可能會發生變化. 如果你不想ftp修改原文件, 可以使用bin模式(二進制模式)傳輸文本。
另外,在使用github時,我們可能會遇到這樣的設置問題:
在學習git軟件,安裝git到configuring the lien ending conversion時,有三個選項。
a.Checkout Windows-style,commit Unix-style line endings.
b.Checkout as-is,commit Unix-style line endings.
c.Checkout as-is,commit as-is line endings.
這里面講到了做兩個操作(Checkout,Commit)的三種處理line endings的操作(Windows-style,Unix-style,As-is)。
為什么會出現這三種處理line endings(行尾結束符)呢?在Git的幫助頁面給出了很好的解釋。
Reference From:https://help.github.com/articles/dealing-with-line-endings
If you're using Git to collaborate with others on GitHub, ensure that Git isproperly configured to handle line endings.
Every time you press return on your keyboard you're actuallyinserting an invisible character called a line ending . Historically, differentoperating systems have handled line endings differently.
When you view changes in a file, Git handles line endings in its own way.Since you're collaborating on projects with Git and GitHub, Git mightproduce unexpected results if, for example, you're working on a Windows machine,and your collaborator has made a change in OS X.
意思很好理解,就不翻譯了。重視由於歷史的原因,各種不同的操作系統在處理行尾結束符采取了不同的處理方法。而Git和GitHub
三種處理方式的不同:
CRLF->Windows-style
LF->Unix Style, Mac Style(注:有些人認為Mac Style是CR,我查了一些資料,發現應該是這樣的:老的Mac是CR,后來的OSX全部改成了LF)
CRLF表示句尾使用回車換行兩個字符(即我們常在Windows編程時使用"\r\n"換行)
LF表示表示句尾,只使用換行.
CR表示只使用回車.
在Git中如何轉換?
在Git通過下面的命令配置
$git config --global core.autocrlf true
# Configure Git on Windows to properly handle line endings
解釋:core.autocrlf是git中負責處理line endings的變量,可以設置三個值--true,inout,false.
設置成三個值會有什么效果呢?
If core.autocrlf is set to true, that means that any time you add a file to the git repo that git thinks is a text file, it will turn all CRLF line endings to just LF before it stores it in the commit.。
設置為true,添加文件到git倉庫(即提交代碼)時,git將其視為文本文件。他將把crlf變成lf。
If core.autocrlf is set to false, no line-ending conversion is ever performed, so text files are checked in as-is. This usually works ok。
設置為false時,line-endings將不做轉換操作。文本文件保持原來的樣子。
設置為input時,添加文件git倉庫(即提交代碼)時,git把crlf編成lf。當有人Check代碼(即從git倉庫遷出代碼)時,按照input的方式,即不做修改,完全照搬git倉庫里的。因此在window操作系統下,盡量不要使用這個設置。
Yet another way to show how autocrlf works
1) true: x -> LF -> CRLF 2) input: x -> LF -> LF 3) false: x -> x -> x
where x is either CRLF (windows-style) or LF (unix-style) and arrows stand for
file to commit -> repository -> checked out file
其實總結起來,如果設置autocrlf=false,那么文本文件在git倉庫里存儲和被人check時都不做任何改變,依然保持原來的line-ending。而設置為true或input,其共同點為文本文件在git倉庫里line-ending修改為lf,不管原來是什么樣的line-ending。不同點為autocrlf=true會在有人Check代碼(即從git倉庫遷出代碼)時把代碼line-endings轉換為CRLF,而autocrlf=input不會對line-endings做任何改變。
因此,如果你編輯代碼的系統為windows,就要設置autocrlf=true。如果你編輯代碼的系統為Linux/Mac,就要設置autocrlf=input.
參考文獻:
1、百度百科 "CRLF" http://baike.baidu.com/link?url=scpmj275A8qM1JE0lCgLq0CRNp0ruiXg0t2Szno0cTCAvYwkXOzLbIAJMFNFL_i7kHumKILySfU2sMN5tMp71K
2、百度知道 "什么是CR和LF" https://zhidao.baidu.com/question/918032703926589059.html
3、"CR,LF,CR\LF,回車,換行" http://www.cslog.cn/Content/cr-lf-crlf-new-line-enter/
4、"CRLF和LF" http://www.tuicool.com/articles/IJjQVb
5、Git換行符之autoCRLF配置的意義 http://www.cnblogs.com/yepei/p/5650290.html
6、自定義Git-配置git https://git-scm.com/book/zh/v1/%E8%87%AA%E5%AE%9A%E4%B9%89-Git-%E9%85%8D%E7%BD%AE-Git
