web-dev-qa-db-ja.com

WinMerge:同じコンテンツで異なるエンコーディングのファイルを比較する方法は?

動機:後で処理するためにドキュメント-テキストファイルを書き直しています。新しいソースはUTF-8を使用するようになりました。ソースの大部分は同じです。違いを見つける必要があります。

詳細:古いドキュメントソースはcp1250エンコーディングを使用し、新しいソースはUTF-8を使用します。新しいソースと古いソースの両方が同じ行末(CR + LF)を使用します。 WinMergeアプリケーションのUnicodeバージョン(WinMergeU.exe)、バージョン2.12.4.0を使用しています。

ほぼ機能しますが...線が異なる場合、最初は濃い黄色でブロックとしてマークされ、異なる部分は明るい色でマークされます。赤いブロックカーソルをそこに移動すると、下のペインに別の部分が表示されます。

ただし、テキスト(のUnicode表現)が同じ場合も、テキストのブロックは濃い黄色でマークされます。赤いブロックは、ファイルのそれらの部分にも移動します。このような場合、下の2つのペイン(違いを示しています)には同じテキストが含まれており、異なるものとしてマークされているものはありません。下の画像を参照してください。

Example of the line that should not differ.

最初の行は異なります-これは問題ありません。しかし、2行目は視覚的に同じ内容です。 ASCIIの範囲外の唯一の文字はÚ そこ。エンコードされたソースでは異なる表現になります。これにより、線が異なるとマークされますが、下のペインでは、線のいずれも異なるとマークされません。

まったく同じ次の段落も参照してください(ソースのエンコーディングのみが異なり、同じ行末が使用されます)。

最初の比較は、線のバイナリ表現に基づいているように見えます。比較(つまりブロックマーキング)はUnicodeコンテンツに基づくべきであることをWinMergeに伝える設定はありますか?

一生懸命頑張りましたが、まだ運がありません。

更新:上記の質問は最新の安定版2.12.4に関するものでした。ベータ版2.13.22は私にとって完璧に機能します。 以下の私の答え を参照してください。

16
pepr

異なるエンコーディングで保存されたファイルをマージできるようにすることは、マージツールのタスクではないはずだと思います。

エンコーディングは、バイト(ディスクまたはメモリに格納されている)を文字(画面に表示されている)にマップする関数です。残念ながら、デフォルトでは、ファイルのエンコーディングはファイルと一緒に保存されません。したがって、ファイルを開いてその内容を表示したいプログラムは、エンコーディングを推測する必要があります。これは時々機能しますが、エラーが発生しやすい手順でもあります。

現在、異なるエンコーディングの文字セットは一般的に重複していません。では、文字CがエンコーディングYの文字セットの一部ではない場合、エンコーディングXのファイルAからエンコーディングYのファイルBに文字Cをマージする場合、マージツールは何をするはずですか?

したがって、マージツールのタスクは、バイナリコンテンツをマージすることであると思います。それ以外のものは汚いハックであり、あるレベルで失敗するのは酷いです。 (マージツールメーカーは、文字レベルのマージを提供することを決定する場合があります。これもほとんどの場合に機能する可能性があります。ただし、推測が必要です。)

したがって、最初に古いファイルをUTF-8に変換してから、それらを新しいバージョンとマージすることもお勧めします。

8
ilmiacs

これはWinMergeについてのあなたの質問に実際には答えませんが、別のdiffプログラムの使用を検討しましたか?私のお気に入りの1つはkdiffです- http://kdiff3.sourceforge.net/

1つのUTF8ファイルと別のUnicodeファイルを使用してKDiffで比較を行うと、次のようになります。KDiff Compare Warning

これが比較画面です。ファイルのエンコーディングは異なりますが、テキストの観点からはファイルは等しいと見なされることに注意してください。

KDiff Compare Results

10
chue x

ご参考まで。質問は最新の安定版2.12.4でした。ベータ版2.13.22を試しましたが、完全に機能します。まったく同じファイルの違いを確認してください。ファイルの最初の行だけが削除されました。 (著者に感謝します。)

enter image description here

4
pepr

差分をとる前に、ファイルを同じエンコーディングに変換することをお勧めします。

バージョン管理システムを使用している場合は、次のことをお勧めします。

  1. ファイルの新しいチェックアウトを作成します
  2. すべてのファイルをUTF-8に変換します
  3. ファイルをコミットする
  4. 新しいファイルをコピーします
  5. WinMergeを使用する

そうすれば、履歴に2つのコミットが発生します。1つはエンコーディングの変更用で、もう1つはコンテンツの変更用であり、WinMergeは期待どおりに機能します。

1
bikeshedder
  1. 編集->オプション
  2. 左側のカテゴリペインから[比較]を選択します。
  3. チェックボックス「キャリッジリターンの違いを無視する」(UNIX、Windows、Mac)
1
JamilShah

WinMergeのオプションFile -> File Encoding...はどうですか?ファイルのエンコーディングを個別に設定できます。

0
Ruslan Osipov