Windows の改行が Unix の改行よりも大きいのはなぜですか?

Windows の改行が Unix の改行よりも大きいのはなぜですか?

そこで、127,955 行で各行に 24 個のランダムな文字を含む 2 つのファイルを作成しました。テキストに関しては、2 つのファイルは完全に同一です。ただし、1 つのファイルには Unix の改行があり、もう 1 つのファイルには Windows の改行がありました。Unix の改行があるファイルは 3,124 KB で、Windows の改行があるファイルは 3,249 KB でした。ファイル間にその他の違いはなかったので、何らかの理由で Wi​​ndows の改行の方が多くのスペースを占めると推測せざるを得ません。理由がわかりますか?

答え1

テキスト ファイルを 16 進エディターで開くと、行末の違いは次のようになります。

Windows の行末:0x0D 0x0A

Unix の行末:0x0A

0x0D、キャリッジ リターンの 16 進数値です (テキストでは単に と表されます\r)。

0x0A、改行文字の 16 進値です (テキストでは単に と表されます\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

実際の「なぜ」という部分については、歴史的に、テレタイプライターはキャリッジ リターン (16 進数 0D) を使用してプリント ヘッドを左余白に移動し、続いてライン フィード (16 進数 0A) を使用して用紙を進めていました。

Commodore、Atari、および (Unix 以前の) Apple は、行末記号として復帰文字を保持し、Unix は改行文字を保持し、CP/M / DOS は両方を保持しました。

多くのインターネット プロトコル (HTTP など) は依然として両方 (別名「CRLF」) に基づいて定義されていますが、実際のテキスト ファイルでは、Windows 上で「単なる」改行を正しく処理しない唯一のプログラムはメモ帳です。

技術的には、「改行」という用語は、この歴史的な違いを隠すためだけに存在します。たとえば、C では「\n」、Lisp では #\Newline は、ローカル システムが好む表記法にマップされますが、特定のバイト文字が必要な場合は「\r」または #\Return が使用されます。

答え3

Windows では、復帰改行を使用します。Unix では、改行のみを使用します。つまり、改行ごとに 1 バイト追加されます。

関連情報