所以我創建了兩個文件,每個文件有 127,955 行,每行有 24 個隨機字元。就文字而言,這兩個文件完全相同。然而,一個檔案有 Unix 換行符,另一個檔案有 Windows 換行符。帶有 Unix 換行符的檔案為 3,124 KB,帶有 Windows 換行符的檔案為 3,249 KB。這些文件之間沒有其他差異,因此我不得不假設由於某種原因 Windows 換行符號佔用了更多空間。知道為什麼嗎?
答案1
如果您在十六進位編輯器中開啟文字文件,您將在行尾看到的差異如下:
Windows 行結尾:0x0D 0x0A
Unix 行結尾:0x0A
是0x0D
回車符的十六進位值(在文字中簡單表示為\r
)。
是0x0A
新行字元的十六進位值(在文字中簡單表示為\n
)。
當行結尾採用 Windows EOL 格式時,行將以 2 個字元結尾:\r\n
;而 Unix EOL 格式以 1 個字元結尾:\n
.
因此,127,955 * (24 + 1) == 3,198,875 bytes (3,123.9 KB)
對於 Unix EOL 和127,955 * (24 + 2) == 3,326,830 bytes (3,248.86 KB)
Windows EOL。
希望有幫助。
答案2
至於實際的“為什麼”位 - 歷史上,電傳打字機使用回車符(十六進制 0D)將打印頭移動到左邊距,然後使用換行符(十六進制 0A)來推進紙張。
Commodore、Atari 和(Unix 之前的)Apple 保留回車符號作為行結束符號; Unix 保留了換行符; CP/M/DOS 保留了兩者。
許多網際網路通訊協定(例如 HTTP)仍然是根據兩者(又稱「CRLF」)來定義的,但在實際的文字檔案中,我遇到的 Windows 上唯一不能正確處理「只是」一行的程式Feed 是記事本。
從技術上講,“換行符”一詞的存在只是為了掩蓋這種歷史差異。例如,在C 中,「\n」或在Lisp 中,#\Newline 會對應到本機系統碰巧喜歡的任何表示法,與「\r」或#\Return 相比,當專門需要一個特定的位元組字符時。
答案3
Windows 使用回車符後跟換行符號。 Unix 僅使用換行符號。所以每個換行符都會多一個位元組。