TextDiff は、2つのテキストの違いを見つける無料のオンライン diff ツールです。文書の下書きと修正版、送付した契約書と戻ってきた契約書、コードの旧バージョンと新バージョンのように、よく似ているけれど少しだけ違う2つの文章を並べ、どの行が追加・削除・変更されたか、さらに行の中でどの単語や文字が変わったかを色で示します。
比較はすべてブラウザ内で行われます。入力したテキストや読み込んだファイルはサーバーに送信されないため、社内文書や契約書のように外部に出しにくい内容も比較できます。計算は Web Worker で実行されるので、数万行の入力でも画面が固まりません。
主な機能
行+行内のハイライト
変更された行を見つけたうえで、その行の中で単語・空白区切り・文字単位で変わった部分だけをもう一度強調します。
分割・統合表示
左右に並べる分割表示(side-by-side)と、git のように上から下へ読む統合表示(unified)を切り替えられます。
無視オプション
行末の空白、空白の量、すべての空白、大文字小文字、空行を無視して比較できます。
改行コードの正規化
Windows(CRLF)と macOS・Linux(LF)の改行の違いや、最終行の改行の有無を同じものとして扱います。
JSON キーをソートして比較
2つの JSON をパースしてオブジェクトのキーをソートし、インデントを揃えてから比較します。キーの順序が違うだけの場合は差分として扱いません。
変更の統計と移動
追加・削除・変更された行数と類似度(%)を表示し、前/次の変更へすぐに移動できます。
変更のみ表示
変わっていない長い区間を折りたたみ、変更の前後3行だけを残します。折りたたまれた区間はクリックで展開できます。
ファイルのドラッグ&ドロップ
.txt、.md、.json、.csv やさまざまなコードファイルを欄にドロップするか、2つのファイルを一度にドロップしてすぐに比較できます。
patch・HTML 出力
結果を unified diff(patch)テキストとしてコピー・保存したり、色付きの HTML 表としてコピーしてメールや文書に貼り付けたりできます。
使い方
- 左の欄(元のテキスト)に基準となるテキストを、右の欄(変更後)に比較するテキストを貼り付けます。ファイルを欄にドロップするか、欄の上の「開く」ボタンを使ってもかまいません。
- 「入力と同時に比較」がオンなら、入力を止めた瞬間に結果が表示されます。オフの場合は[比較する]または Ctrl+Enter を押します。
- 必要に応じて、空白・大文字小文字・空行の無視、行内比較の単位(単語/空白区切り/文字)、JSON キーのソートを選びます。オプションを変えるとすぐに再比較します。
- 結果バーで分割/統合表示を選び、上下の矢印ボタン(または Alt+↑/↓)で変更箇所の間を移動します。
- 共有したいときは patch をコピー・保存するか、HTML としてコピーします。
比較オプションの説明
| 空白:そのまま比較 | 空白やタブをほかの文字とまったく同じに扱います。インデントが1つ違うだけでも別の行になります。 |
|---|---|
| 空白:行末の空白を無視 | 行末に残った空白・タブだけを無視します。エディタが自動で削除したり残したりした空白による差分を取り除きます。(GNU diff の -Z に近い) |
| 空白:空白の量を無視 | 空白が1つでも複数でも同じとみなします。ただし、空白がある所とない所は引き続き別物です。'a b' と 'a b' は同じ、'a b' と 'ab' は別です。(diff -b) |
| 空白:すべての空白を無視 | 空白をすべて取り除いてから比較します。'a b' と 'ab' も同じ行とみなします。(diff -w) |
| 行内比較:単語 | 英数字のまとまりと記号を単位として変更箇所を示します。コードや英文に適しています。 |
| 行内比較:空白区切り | 空白で区切られたかたまりを単位として示します。英語や韓国語のように単語の間に空白を入れる言語の文章に向いています。日本語や中国語のように空白で区切らない文章では、文字単位のほうが役立つことが多いです。 |
| 行内比較:文字 | 1文字ずつ比較します。金額・日付・条項番号のように1〜2文字だけ変わった箇所を正確に見つけたいときに使います。 |
| 大文字小文字を無視 | 英字の大文字と小文字を同じ文字として扱います。 |
| 空行を無視 | 空の行や空白だけの行を比較から除外します。空行は薄い色で表示され、変更数には数えません。(diff -B に近い) |
| 改行コードを正規化 | CRLF・CR・LF をすべて同じ改行とみなし、ファイル末尾の改行の有無も無視します。オフにすると、行末の CR は ␍ で、最終改行のない行は ∅ で表示されます。 |
| JSON キーをソート | 両方を JSON としてパースし、オブジェクトのキーを辞書順に並べ替えて2スペースのインデントで書き直してから比較します。配列の順序は変えません。パースに失敗するとエラーの位置を知らせます。 |
改行コード(CRLF など)の違いを正確に比較できるのは、ファイルから読み込んだテキストだけです。入力欄に貼り付けたテキストはブラウザが改行を LF に変換するため、CR の違いは表示されません。
ショートカットキー
Ctrl+Enter / ⌘+Enter | 今すぐ比較 |
Alt+↓ / Alt+↑ | 次/前の変更へ移動 |
n / p(入力欄の外で) | 次/前の変更へ移動 |
Tab(入力欄の中で) | タブ文字を入力 |
入力内容はどこにも送信されません
比較エンジンはこのページと一緒にダウンロードされる JavaScript(diff-core.js)で、テキストやファイルはブラウザのメモリ内だけで処理されます。入力内容は保存せず、ブラウザにはテーマとオプションの選択だけを記憶します。ページを閉じると入力内容は消えます。
よくある質問
比較するテキストはサーバーに保存されますか?
いいえ。比較はブラウザ内の JavaScript だけで行われ、入力内容はどのサーバーにも送信されません。すでに開いているページなら、ネットワークを切断した状態でも比較できます。
どのくらい大きなテキストまで比較できますか?
ファイルは1つあたり 30MB まで読み込めます。数万行規模の比較も別スレッド(Web Worker)で処理するため、画面は固まりません。差分が非常に多い場合は、速度を優先して最小ではない近似結果を出すことがあります。結果が 4,000 行を超えると、変更部分だけを先に表示します。
どのアルゴリズムを使っていますか?
行単位の比較には Myers(1986)の O(ND) 差分アルゴリズムを線形空間方式で実装して使っています。コストが大きくなりすぎると、GNU diff と同じように近似分割に切り替えます。変更された行の中では、同じアルゴリズムで単語・空白区切り・文字をもう一度比較します。
「変更」と「追加・削除」はどう区別していますか?
変更された区間の中で、削除された行と追加された行の内容が十分に似ていれば、1行が書き換えられたものとしてペアにし「変更」と数えます。ペアにならない行は「追加」または「削除」と数えます。
類似度(%)はどう計算していますか?
両側の全文字数(改行を含む)のうち、変わっていない文字の割合です。同じ行はすべて、変更された行は行内で同じまま残った部分だけを同じ文字として数えます。
「空白の量を無視」と「すべての空白を無視」は何が違いますか?
「空白の量を無視」は空白がいくつあるかだけを無視するので、'a b' と 'ab' は別物として扱います。「すべての空白を無視」は空白をすべて取り除いてから比較するので、両者を同じとみなします。Python のようにインデントに意味があるコードでは、「すべての空白を無視」は慎重に使ってください。
無視オプションをオンにして作った patch は適用できますか?
patch は画面に表示された差分をもとに作られ、文脈行は元のテキストから取られます。無視オプションをオンにすると、無視された差分は patch に含まれません。ファイルを完全に同じにしたい場合は、オプションをすべてオフにしてから patch を作成してください。
Word、一太郎、PDF の文書も比較できますか?
ファイルのままでは読み込めません。文書からテキストをコピーして貼り付ければ比較できます。その際、表・脚注・書式は失われることがあります。詳しいコツは文書比較のガイドをご覧ください。
スマートフォンでも使えますか?
はい。狭い画面では入力欄が縦に並び、結果は統合表示で始まります。分割表示に切り替えることもできます。