キャリッジリターンのため、Windows上のLinuxよりもテキストファイルが大きいのですか?

キャリッジリターンのため、Windows上のLinuxよりもテキストファイルが大きいのですか?

LinuxとWindowsに同じASCIIテキストファイルがあるとしましょう。

one
two
three

これら2つのファイルには、両方のオペレーティングシステムにそれぞれ\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それぞれ1バイトを占めるため、LinuxではDOS / Windowsスタイルの改行文字を使用するとき)。 、改行ごとに1バイトが失われます。

厳密に言えば、保存要件はファイルの作成に使用するプログラムによって異なります。 LinuxやWindowsはファイルの内容に何も課しません。 CRLF改行文字を含むファイルはLinuxに保存でき、LF改行文字を含むファイルはWindowsに保存できます。両方のオペレーティングシステムのいずれかでファイルの保存要件を決定するには、使用するツールを使用して両方のオペレーティングシステムにファイルを作成し、オペレーティングシステムツールを使用してファイルサイズを測定する必要があります。

ファイルは通常、特定のストレージ単位の倍数を使用して保存されるため、改行に関連する変更は実際の影響を与えない可能性があります。

答え2

おそらく。

Windows は、CR と LF 文字を特別に扱うことなく、バイナリ ファイルを完全に保存できます。それ以外の場合、バイナリファイル形式は機能しません。ただし、Windowsプログラムは通常、LFのみを使用するUnixenルールとは異なり、改行文字をCR + LFペアとして保存します。この習慣がシステムライブラリにプログラムされている可能性がありますが、長い間Windowsプログラミングに触れたことがないので、お話できません。

しかし、それだけではありません...メモ帳を開いてファイルを保存し始めると、いくつかの書式設定オプションが表示されます。私が持っているシステムでは、「ANSI」、「Unicode」、および「UTF-8」を選択できます。内容foo⏎bar⏎doo⏎(ここでは改行文字)を含むファイルを作成し、結果のファイルサイズは15、32、18バイトでした。

最初は単純で、foo\r\nbar\r\ndoo\r\nWindows-1252コードページに保存されていますが、これらの文字とは何の関係もありません。 An はäここにバイトとして格納されます。 2番目はUTF-16(またはUCS-2?)なので、文字ごとに2バイトに2バイトのBOM(バイト順を表示)が追加されます。文字にはCR、LFが含まれるため、15文字にBOMを加えて合計32バイトです。 3番目のUTF-8は、UTF-8でエンコードされたBOMがテキストの前に追加され、3バイトが追加されることを除いて、最初のものと同じです。 UTF-8では、anはä2文字です。まあ、それを書いた後に「ASCIIテキストファイル」について言及しましたが、エンコーディングの違いにより、アプリケーションがファイルに何をしたいのかを書くことができることがわかりました。

echo -e 'foo\nbar\ndoo\n'WindowsでCygwinのBashを使用して実行すると、CRバイトなしで12バイトしか取得できないことを願っています。同様に、Windows上のすべてのテキストエディタは、LFのみを改行文字として使用してファイルを保存できます。

したがって、実際にファイルを生成するために使用するプログラムとファイルを保存するように要求する形式によって異なります。

関連情報