日本語

開発者ツール · テキスト比較

なぜ Windows と Unix は行末に関して意見が一致しないのか: CR、LF、CRLF の話

· 背景

テキストの差分 行末 ソフトウェア履歴

同じテキスト行のペアに収束する 3 つの改行マーカー パス
オリジナル ToolAcre ベクトル イラスト

タイプライターやテレタイプから最新のオペレーティング システムまで行末を追跡し、すべてのクロスプラットフォーム プロジェクトで 2 つの規則が依然として共存している理由を説明します。

1 人の目に見えないキャラクター、数十年にわたる摩擦 — クロスプラットフォームでの永続的な煩わしさから始まります

行末は通常のエディタでは表示されませんが、ファイルやプロトコルにとっては重要な場合があります。ただし、ToolAcre では、ライン比較の前に CR、LF、CRLF が正規化されます。これらのセパレータのみが異なるペアは、同じ行配列と同じ結果を生成します。

この動作は、診断できる内容を制限しながら、このルートの実際的な問題を解決します。この比較では、テキストが編集者に到達した後に元のファイルにどの改行バイトが含まれているかを証明することはできません。保存またはプロトコル チェックにはバイト対応ツールが必要です。

タイプライターのキャリッジ リターンとライン フィード — キャラクターが最初に説明した 2 つの物理的アクションを説明します

キャリッジ リターンとライン フィードという用語には物理的および歴史的な意味がありますが、リポジトリにはタイプライター ソースが含まれていません。記憶に基づいて機械的に起源の物語を繰り返すことは、たとえその説明に見覚えがあるように聞こえたとしても、証拠契約に違反することになります。

したがって、この記事では、実装で使用される場合にのみ、CR を ` ` コード単位として、LF を ` ` として扱います。歴史的な説明は、明らかに出典ではないアウトラインから借用するのではなく、一次標準またはアーカイブから後から追加する必要があります。

タイプライターの意味は、外部ソースを必要とする歴史的な主張です

同様に、ソース ファイルにはテレタイプの規則や初期のオペレーティング システムの決定が文書化されていません。これらは、現在の JavaScript における互換性の選択肢のみを明らかにします。分割する前に、すべての CRLF または単独の CR を LF に置き換えます。

この変換は、出力を末尾のみの変更で埋めることなく、いくつかの規則に従って生成された貼り付けられたテキストを受け入れます。これは、1 つの正規表現で表示される実装の決定であり、3 つの形式すべてのテストによって固定されます。

テレタイプとオペレーティング システムの系統はリポジトリの証拠の外にあります

Unix は LF、Windows は CRLF、古いシステムは単独の CR と関連付けられるのが一般的ですが、現在のリポジトリはそれらの採用の歴史的証拠として機能しません。安全な主張は機能します。3 つの入力はすべて `splitLines` 内で LF になります。

ターミナル LF は最後の空の行を作成せず、中間の空行は残ります。この区別は、物理的な区切り文字の違いが消去されても、論理的な内容は保持されることを意味します。比較はバイトを保持するのではなく、行指向で行われます。

このコードは、3 つの規則が正規化されることを証明しています。なぜシステムがそれらを採用したかは証明されない

一部のネットワーク プロトコルとメッセージ プロトコルでは正確な行終端記号が指定されていますが、その要件は仕様に基づいている必要があります。 ToolAcre の正規化では、元のセパレータの証拠が意図的に削除されるため、このようなワイヤ形式への適合性を証明するのには適していません。

正確な CRLF シーケンスが重要な場合は、解析する前に 16 進ビューアまたはプロトコル バリデータを使用します。クリーンな Text diff 結果では、論理行の一致を確認できると同時に、トランスポート レベルの欠陥を隠すことができます。ツールは異なる質問に答えるため、どちらの観察も真実である可能性があります。

プロトコル要件には独自の仕様が必要なので、ここでは省略します

`alpha beta`、`alpha beta`、および `alpha beta` をペアで比較します。それぞれアルファとベータの 2 行が生成されますが、追加や削除はありません。空白を無視してもこの等価性は生じません。正規化は分割中にすでに行われています。

1 つのベータ行に末尾のスペースを追加すると、通常モードで差異が報告されるようになります。 [空白を無視] を有効にすると、空白が消える場合があります。このシーケンスにより、改行の処理と行キーの空白の処理が分離され、間違ったオプションがクレジットされるのを防ぎます。

有効な例: 3 つの終了形式はすべて、空白オプションの前では等しいものとして比較されます。

このルートでは、エディターの構成、ファイルの書き換え、Git 属性の設定、または末尾の一括変換は行われません。また、結果行の元の区切り文字も公開されません。貼り付けられた文字列は、改行移行ユーティリティではなく、比較パイプラインに入ります。

歴史的因果関係とプロトコル標準は保留中のソースから省略されています。この制約により、この実装で 3 つの規則が何を行うのか、どの空白行が残るのか、そしてなぜここでの等価性がバイトの同一性を確立しないのかという、小さいながらも正確な記事が残ります。

要点: テキストにどの規則が適用されているかを知る — 履歴と、ToolAcre のテキスト比較が違いが行末のみであるかどうかを確認するのにどのように役立つかを要約します。

どの証拠がツールに残っているかを確認します。正規化後、ToolAcre は共通の区切り文字間で論理行の内容を比較できます。どちらのソースがどの規則を使用したか、またはダウンストリームのコンシューマが 1 つの正確なバイト シーケンスを必要とするかどうかはわかりません。

人間によるレビューにはブラウザの差分を使用し、リポジトリまたはプロトコルの適用にはバイトレベルのチェックを使用します。ツールは、その変換が明示的である場合に信頼できます。レビュー担当者は、検証する必要があるプロパティを保持するものを選択する責任を負います。