Unix/Linux/Mac 與 Windows 的換行符不統一的原因/目的是什麼?

更新:

很多人第一反應是我對Unix/Linux 有偏愛,所以一切要以Unix/Linux 為準。

其實並沒有。

我喜歡Unix/Linux 上的GNU 工具,但是也喜歡Windows 上的很多東西。

我的初衷就是遇到了換行符不一致導致的問題,然後思考不統一起來的原因是什麼,未來有沒有可能統一?

至於說都改成"
",只是因為根據了解,兩個字元的換行在計算機上並沒有嚴格要求,基於避繁就簡的簡單想法。

結論:只要改成一樣,都是欣然接受,熱烈鼓掌的。

==================================

假設1,Windows 先制定了規則,

然後Unix/Linux 和Mac 覺得兩個字元浪費,決定用一個字元,為什麼後者不沿用前者方案(最開始Unix/Linux是"
",Mac是"
")?

既然後來Mac 可以改成跟Unix/Linux 一樣的「
」,
那為什麼Windows 不試著改成一樣的「
」?

假設2,Unix/Linux 先制定規則,

那Windows 為什麼要用兩個字元,故意弄不一樣?

=================================

關於「回車」(carriage return)和「換行」(line feed)這兩個概念的來歷和區別:

在計算機還沒有出現之前,有一種叫做電傳打字機(Teletype Model 33)的玩意,每秒鐘可以打10個字元。但是它有一個問題,就是打完一行換行的時候,要用去0.2秒,正好可以打兩個字元。要是在

這0.2秒裡面,又有新的字元傳過來,那麼這個字元將丟失。

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

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

後來,計算機發明了,這兩個概念也就被般到了計算機上。那時,存儲器很貴,一些科學家認為在每行結尾加兩個字元太浪費了,加一個就可以。於是,就出現了分歧。

Unix/Linux 系統里,每行結尾只有「&<換行&>」,即「
」;Windows系統裡面,每行結尾是「 &<回車&>&<換行&>」,即「
」;Mac系統里,每行結尾是「&<回車&>」,即「
」(現在已改成跟Unix/Linux一樣的"
")。

一個直接後果是,Unix/Linux/Mac系統下的文件在Windows里打開的話,會出現換行丟失,整個文本會亂成一團。(類似UltraEdit 這種編輯器可以正確識別); 而反過來就會出現^M的符號(這是Unix/Linux 等系統下規定的特殊標記,佔一個字元大小,不是^和M的組合,列印不出來的,可以通過ctrl+V, ctrl+M 輸入)。Unix/Linux 下很多文本編輯器(命令行)會在顯示這個標記之後,補上一個自己的換行符,以避免內容混亂(只是用於顯示,補充的換行符不會寫入文件,有專門的命令將Windows換行符替換為Unix/Linux 換行符)。 Unix/Linux 系統下的換行符在Windows系統的文本編輯器中會被忽略,整個文本會亂成一團。

Windows 的換行是
,十六進位數值是:0D0A。

Unix/Linux/OS X 的換行是
,十六進位數值是:0A。


瀉藥。。。事情是這樣的。。。

換行符是最開始模擬打字機的大家也都知道了,所以當時的情況是怎麼樣的呢。

在最早的 ASCII 標準(1963-1968)中,有兩套標準,一套是 ISO 出的認為 CRLF 和 LF 都是標準的;然而另一套是 ASA 出的只認為 CRLF 是符合標準的。

所以 MS-DOS(1981)設計的時候是採用了在兩種方法中都符合標準的 CRLF,一方面是滿足了兩個標準,另一方面是兼容了當時大量採用 CRLF 的計算機。

然而 unix 作為一個連 e 都懶得加的系統,你讓人家加一個 CR?科科。。。然後 Linux 的很多設計上也兼容了 unix,mac os x 也投奔了 unix。

就有了現在三大 PC 只有 windows 有 CRLF 這樣的尷尬場面。

其實真正異類的是老 mac os 這種用 CR 的系統。。。大家快點去干他們。。。

大家可以看一下:Newline

-------------------------------------------------------------------------------------------------------------

其實,從真正實際使用的角度來說,

大部分 editor (比如 sublime text)不管是在 unix 上還是 Linux 上都默認採用的是 windows line ending,這樣兼容了所有的系統(除了老 mac os)。

至於 vim 和 emacs 也有 oneliner 來改動 line ending

File format - Vim Tips Wiki

EmacsWiki: End Of Line Tips

而且 windows 上基本除了 notepad 都支持 unix line ending ,包括比較新版本的 vs。

所以相對來說因為 line ending 出現的錯誤還是比較少的。

----------------------------------------------------------------------------------------------------------

至於為什麼 mac 可以改,因為 mac os x 和 mac os 簡直就是超越了雷鋒和雷峰塔的區別。。。

不得不說,比起 mac os x, mac os 和蟑螂長得更像一些。。。


你們都沒抓住重點

CR 和 LF 最初是控制電傳印表機(Teletype,所以 UNIX 裡面有個 tty,就是這玩意的縮寫)的,CR 把列印頭移動到行首,LF 把紙上卷一行,因為 CR 要的時間更長所以一般要求換行的過程裡面都是 CR 在前(有些早期設備甚至還會在 CR 和 LF 之間插 NUL,確保列印頭完成複位)。DOS 從 DEC 和 CP/M 那裡繼承了這個設計,這樣文本文件的位元組序列可以直接控制印表機。

而 Unix 的前身 Multics 裡面有一個驅動程序,會自動將 LF 轉換成 CR-LF(甚至 CR-NUL-LF),所以他們用了單一的 LF。


@章程 已經講得差不多了,我補充一點。

來自著名的The Old New Things:

Why is the line terminator CR+LF?

If you go to the various internet protocol documents, such as
RFC 0821 (SMTP),
RFC 1939 (POP),
RFC 2060 (IMAP),
or RFC 2616 (HTTP),
you』ll see that they all specify CR+LF as the line termination
sequence.
So the the real question is not 「Why do CP/M, MS-DOS, and Win32 use CR+LF
as the line terminator?」 but rather 「Why did other people
choose to differ from these standards documents and use some other
line terminator?」

換句話說,Unix系才是不遵守標準協議的一方。


是我,是我先,明明都是我先的。。。制定規則也好,實現標準也好,還是系統上線也好。

第一次,制訂了標準

還按照CRLF來實現

兩份的規則互相重疊

這重疊的規則又帶來了更好的兼容性

本應該得到了夢幻一般的業界支持

然而,為什麼,會變成這樣?


其實啊,我覺得 Windows 和 Unix 對回車和換行的處理都是有點不對的。

理論上 CR("
")對應打字機的回車,也就是回到行首,LF("
")對應打字機的換行。所以當我們

printf("first line
second line");

的時候,理論上輸出應該是這樣的:

first line
second line

因為這裡只有換行,沒有回車。而不管是在 Windows 還是 Unix 上,前面這樣的輸出都是:

first line
second line

理論上只有

printf("first line
second line");

printf("first line

second line");

的時候,輸出才應該是

first line
second line

而如果

printf("first line
second line");

輸出當然就變成了

second line

後兩種情況,在兩種系統上的顯示都是正確的,只有第一種情況是不對的。

============================

經知友指出,補充一下,fopen 時使用文本模式的情況下,C 庫默認會對換行符進行轉換。但 stdout 默認是以二進位模式打開的。而在此默認情況下,輸出
時,Windows 依然是會換行的,而此時 C 庫並未對換行符做處理。而至於輸出到文件的情況,那就看你打開文件的編輯器是怎麼處理的了,跟我說的這個沒什麼關係,對於這個情況討論這個問題就沒什麼意義了。


@章程 把該說的都說了,我就是來吐槽一下的。

自從我們在三年級學習了縮寫之後,大概可以把題目改成這樣:

假設1,Windows 先制定了規則,

那為什麼Windows 不試著改成跟Linux一樣?

假設2,Linux 先制定規則,

那為什麼Windows 故意不改成跟Linux一樣?


因為他們的設計師不一樣啊


因為那時的存儲設備非常昂貴,一些人認為在每行的結尾加兩個字元用於換行,實在是極大的浪費,於是各個廠商在這一點上便出現了分歧。

所以

1964年設計的Multics系統就使用了LF

1974年設計的CP/M,考慮到兼容早期的老式機器,使用了CRLF

兩家的繼承者們從此就分道揚鑣了

—————

我個人懷疑是1974年硬體更便宜了,所以Digital Research Inc.才會願意浪費錢,去兼容老設備。

至於Mac OS X已經完全放棄過去,改投到Unix門下。


題外話:不是喜歡工具,而是喜歡工具潛在的會給你帶來的價值。

工具是人的思維和邏輯的具化。


這事你得問後開發的啊


其實我不介意是誰在遵循著標準,但我比較介意你倆能不能統一成一個標準,不要搞得要通過github來統一換行符…


推薦閱讀:

Macbook的wifi會突然斷線,如何解決?
用慣了 Windows 的人用 macOS 會有什麼不適?
給 Macbook Pro 配什麼配件比較好?
方便放置kindle,iPhone,Mac和記事本的簡潔公文包推薦?
Mac 程序員開發的利器是什麼?

TAG:Mac | MicrosoftWindows | Linux | Unix | 換行 |