改行コード
改行を表す制御文字。LF (Unix)、CR (旧 Mac)、CRLF (Windows) の 3 種類がある。
改行コードとは、テキストデータにおいて行の終わりと次の行の始まりを示す制御文字です。主に LF (Line Feed, U+000A)、CR (Carriage Return, U+000D)、CRLF (CR と LF の 2 文字の組み合わせ) の 3 種類があります。これらの名称はタイプライターの動作に由来しており、CR は印字ヘッドを行頭に戻す動作、LF は用紙を 1 行分送る動作を意味していました。コンピュータの黎明期にこの概念がそのまま引き継がれ、現在に至っています。
OS ごとに標準の改行コードが異なります。Unix/Linux/macOS は LF、Windows は CRLF、旧 Mac OS (Classic Mac OS、Mac OS 9 以前) は CR を使用します。この違いはファイルの互換性に直接影響し、異なる OS 間でテキストファイルをやり取りする際に問題を引き起こすことがあります。Git では core.autocrlf 設定で改行コードの自動変換を制御でき、チーム開発では .gitattributes ファイルでリポジトリ全体の改行コードポリシーを統一するのが一般的です。Git 実践入門の書籍で改行コードの管理方法を学べます。
プログラミングにおいて、改行コードの違いはしばしばバグの原因になります。ファイルを行単位で読み込む際に LF のみを想定していると、CRLF のファイルでは各行の末尾に CR が残ってしまいます。正規表現で行末を $ でマッチさせる場合も、改行コードの違いによって期待どおりに動作しないことがあります。堅牢なテキスト処理を実装するには、\r\n、\n、\r のすべてに対応する設計が必要です。
改行コードはさまざまなプロトコルや仕様でも規定されています。HTTP プロトコルではヘッダーの区切りに CRLF が使われ、CSV ファイルの仕様 (RFC 4180) でも CRLF が標準です。SMTP (メール送信プロトコル) でもメッセージ本文の改行は CRLF と定められています。一方、JSON の仕様では文字列内の改行は \n (エスケープされた LF) で表現します。
よくある誤解として、改行コードは目に見えないため「どれでも同じ」と思われがちですが、実際にはバイト数が異なります。LF は 1 バイト、CRLF は 2 バイトであるため、大量のテキストデータでは改行コードの違いがファイルサイズに影響します。また、エディタやツールによっては改行コードの混在 (同一ファイル内に LF と CRLF が混在する状態) を検出・修正する機能を備えています。プログラミング基礎実践の書籍でテキスト処理の基本を学べます。
文字数カウントの観点では、改行コードを文字数に含めるかどうかが結果に影響します。多くの文字数カウントツールでは改行を 1 文字としてカウントしますが、CRLF を 1 文字と数えるか 2 文字と数えるかはツールによって異なります。正確な文字数を把握するには、使用しているツールの改行コードの扱いを確認しておくことが重要です。