文字行的末尾
通常,操作系統(tǒng)使用CR LF來表示文本行的結(jié)尾。
這個慣例的起源,來自于電傳打印機(jī)那個時代。
CR控制字符會將打印機(jī)的印刷頭(也叫做Carriage)移動到行首(第0列),同時不會進(jìn)紙。
而LF控制字符會進(jìn)一行紙,同時不會移動印刷頭。
所以,如果你想要將印刷頭移動到行首(這樣打印機(jī)會另起一行),同時進(jìn)紙的話,則你需要同時發(fā)送CR和LF這兩個控制字符。
如果你研究過各種RFC協(xié)議文檔,例如RFC0821(SMTP), RFC1939(POP), RFC2060(IMAP)或者RFC2616(HTTP),則你會發(fā)現(xiàn):它們都在文檔里使用了CR+LF作為一行的結(jié)束符。所以,真正的問題不是:為什么操作系統(tǒng)使用CR+LF作為行結(jié)束符,而是:為什么還有其他一些人使用與標(biāo)準(zhǔn)文檔不同的行結(jié)束符。
Unix操作系統(tǒng)接受LF作為行結(jié)束符。如果你仔細(xì)地研究一下stty工具的說明文檔,你會發(fā)現(xiàn):onlcr選項指明了是否將一個LF字符轉(zhuǎn)換為CR+LF序列。
如果你正確地使用此設(shè)定,則你會得到類似如下的遞進(jìn)式文本:
因為這些文本行都沒有將輸入移動到行首。所以即使是Unix操作系統(tǒng),當(dāng)處于原始模式時,都會要求CR+LF作為行結(jié)束符。一個隱含的CR字符會放在LF前面,這可能是Unix的一個不同之處,另一方面,它也比較”經(jīng)濟(jì)”,因為每行只需要一個字符作為行結(jié)束符。
Unix中的C語言將這一轉(zhuǎn)換帶到了標(biāo)準(zhǔn)C語言中,也即:它會要求在行尾添加一個”\n”(就是LF的編碼)字符,然后將LF轉(zhuǎn)換為CR+LF的任務(wù)就丟給了運(yùn)行時庫來做。
在C語言中,還引入了一個名詞”newline”來表達(dá)一個通用的行結(jié)束符。我聽說ASCII委員會在1996年左右將字符0x0A作為”newline”的編碼,所以,這就更加讓人迷惑了。
總結(jié)
請記得:\n是一個轉(zhuǎn)義字符,表示LF,而\r則表示回車(CR)。
所以,在Unix系統(tǒng)里,只使用\n,而在Windows里,使用\r\n作為行結(jié)束符。
這就會導(dǎo)致這樣一個結(jié)果:Unix碰到\n時,會進(jìn)行CR+LF操作,而單單一個\r(CR)不會進(jìn)行換行,而是顯示為一個控制字符(^M)。
在Windows中,需要使用”\r\n”來進(jìn)行換行,如果只使用\n或者只使用\r,或者它們順序不對,都會導(dǎo)致?lián)Q行失敗。
以上內(nèi)容,又進(jìn)一步解釋了這樣一個現(xiàn)象:
Unix/Mac系統(tǒng)下的文件在Windows里打開的話,所有文字會變成一行;
Windows里的文件在Unix/Mac下打開的話,在每行的結(jié)尾可能會多出一個^M符號。
真乃:傻傻分不清楚啊。
最后
Raymond Chen的《The Old New Thing》是我非常喜歡的博客之一,里面有很多關(guān)于Windows的小知識,對于廣大Windows平臺開發(fā)者來說,確實十分有幫助。
本文來自:《Why is the line terminator CR+LF?》
1.《打印機(jī)的頁面怎么換行打字?總結(jié)很全面速看!關(guān)于換行符的解釋》援引自互聯(lián)網(wǎng),旨在傳遞更多網(wǎng)絡(luò)信息知識,僅代表作者本人觀點(diǎn),與本網(wǎng)站無關(guān),侵刪請聯(lián)系頁腳下方聯(lián)系方式。
2.《打印機(jī)的頁面怎么換行打字?總結(jié)很全面速看!關(guān)于換行符的解釋》僅供讀者參考,本網(wǎng)站未對該內(nèi)容進(jìn)行證實,對其原創(chuàng)性、真實性、完整性、及時性不作任何保證。
3.文章轉(zhuǎn)載時請保留本站內(nèi)容來源地址,http://f99ss.com/why/2969269.html