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