由于回车符的原因,Windows 上的文本文件比 Linux 上的文本文件大吗?

由于回车符的原因,Windows 上的文本文件比 Linux 上的文本文件大吗?

假设我在 Linux 和 Windows 上有相同的 ASCII 文本文件:

one
two
three

这两个文件在两个操作系统上将分别具有\n和作为 EOL 字符。\r\n

这是否意味着Linux上的文件更小?

这个测试是在 Linux 上进行的,似乎是肯定的:

$ echo -en 'one\ntwo\nthree\n' | wc --bytes 
14
$ echo -en 'one\r\ntwo\r\nthree\r\n' | wc --bytes 
17

答案1

您的测试是正确的,尽管严格来说是有限的 - 它仅表明在 Linux 上,您的命令生成的字符串echo分别占用 14 和 17 个字节(通过wc --bytes.每个\n\r占用一个字节,因此在使用 DOS/Windows 风格的换行符时,每个换行符都会产生一个字节的损失。

严格来说,存储要求取决于您用来写入文件的程序; Linux 和 Windows 都不会对文件内容强加任何内容。在 Linux 上可以存储带有 CRLF 换行符的文件,在 Windows 上可以存储带有 LF 换行符的文件。要确定文件在任一操作系统上的存储要求,您应该在两个操作系统上使用您打算使用的任何工具编写文件,并使用操作系统的工具测量文件的大小。

请注意,文件通常使用特定存储单元的倍数进行存储,因此与换行符相关的变化可能不会产生实际影响。

答案2

或许。

Windows 完全能够存储任何二进制文件,无需对 CR 和 LF 字符进行任何特殊处理 - 否则任何二进制文件格式都无法工作。但 Windows 程序通常将换行符存储为 CR+LF 对,这与 Unixen 上的习惯不同,Unixen 上的习惯是仅使用 LF。这种习惯也可能被编入系统库中,但我已经很久没有接触过 Windows 编程了,所以我不敢说。

然而,这还不是全部...如果您仅打开记事本并开始保存文件,您将面临一些格式选项。在我手头的系统上,选择是“ANSI”、“Unicode”和“UTF-8”。我创建了一个包含内容foo⏎bar⏎doo⏎(其中是换行符)的文件,生成的文件大小分别为 15、32 和 18 字节。

第一个很简单foo\r\nbar\r\ndoo\r\n,存储在 Windows-1252 代码页中,尽管它与这些字符无关。 Anä将作为一个字节存储在这里。第二种是 UTF-16(或 UCS-2?),因此每个字符两个字节,加上两个字节的字节顺序标记 (BOM)。字符包括 CR 和 LF,所以它是 15 个字符加上 BOM,总共 32 个字节。第三个,UTF-8,与第一个相同,除了 UTF-8 编码的 BOM 作为文本前缀,添加了三个字节。在 UTF-8 中,anä是两个字符。好吧,写完之后,我注意到您提到了“ASCII 文本文件”,但编码之间的差异表明应用程序可以在文件中写入它们想要的任何内容。

我希望如果我在 Windows 下使用 Cygwin 的 Bash 并运行echo -e 'foo\nbar\ndoo\n',我将仅获得这 12 个字节,而没有 CR 字节。同样,Windows 上的任何文本编辑器都可以仅使用 LF 作为换行符来存储文件。

所以,实际上,这取决于您使用什么程序来创建文件以及您要求它保存文件的格式。

相关内容