为什么 Windows 换行符比 Unix 换行符更大?

为什么 Windows 换行符比 Unix 换行符更大?

因此我创建了两个文件,每个文件有 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 只使用换行符。因此,每个换行符都会多出一个字节。

相关内容