因此我创建了两个文件,每个文件有 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 上遇到的唯一不能正确处理“仅”换行符的程序是记事本。
从技术上讲,“换行符”一词的存在只是为了掩盖这一历史差异。例如,在 C 中,“\n”或在 Lisp 中,“#\Newline”会映射到本地系统恰好喜欢的任何符号,而当需要特定字节字符时,“\r”或“#\Return”则会映射到本地系统恰好喜欢的任何符号。
答案3
Windows 使用回车符,然后是换行符。Unix 只使用换行符。因此,每个换行符都会多出一个字节。