はじめに
この記事で取り扱う事象はWinMergeに限った話ではなくShiftJISとCP932の違いによって発生するものであり、私がたまたまWinMergeで遭遇しただけなので、場合によっては他の現象の原因確認にも応用が効くものである。
つまり何が言いたいかっていうと、文字コード問題はマジで徒労ということである。
参考になる記事
@egg_chicken さんの以下の記事がとても参考になり、解決の糸口になった。多謝
https://qiita.com/egg_chicken/items/53f1a5922487a572eaf4
何がおきたか?
とあるふるーいアプリケーションから出力されたCSVファイル(ShiftJIS)をWinMergeで比較しようとしたら、『エンコーディングエラーにより情報が失われています。』とエラーが表示されたとユーザーより相談された。
※画像はWinMerge2.12.4.20+jp-20 のもの。
※2019年2月現在最新のWinMerge2.16.0.7では上記のように表示される。
なぜおきたか?
WinMergeのマージ前動作
WinMergeはエンコードを揃えるため、ファイルをShiftJIS(CP932)で開きなおし、エンコーディングを行っている。
例えばUTF-8のテキストをWinMergeに放り込むと、見事に文字化けし、同様のエラーが表示される。
これは上記のエラー原因を調べている時に知ったことだが、プラグイン等を使うことで、これを吸収することができる。例えばExcelファイルを比較するなんていうこともできる。
では今回のケースはどうか?
この CP932 に開き直す動作を取った時にエンコーディングに失敗し情報が欠損すると、上記のエラーが表示される。ただし、その該当箇所がどこであるかはWinMergeではわからない。
全体が文字化けしていれば、ファイル全体のエンコーディングによるものであるとわかるが、今回は元のファイルも CP932と同意(だと思っていた)である ShiftJIS であり、一見すると問題の無いファイルでエラーが発生しているような状態だった。
検索してもOfficeファイルを比較した場合の例などしか無く、調べるうちに文字コード問題の深淵へ足を踏み入れていくのであった・・・。
今回の原因 ShiftJIS≒CP932
今回WinMergeを通したファイルは ShiftJIS で作成されたファイルで、一見するとWinMerge上でも問題なく表示されており、エラー文の通りのエンコーディングエラーによる情報損失は発生していないように見受けられる。
ただ、このファイルを サクラエディタ で開き、 CP932 で保存すると原因の箇所が炙りだされた。
※サクラエディタに限らず、CP932で保存できるエディタなら確認できると思いますが、今回はサクラエディタで説明します。
サクラエディタでSJISファイルをCP932で保存する。
通常の名前をつけて保存ダイアログではコードページ(CP)のエンコード形式は表示されない。
今回問題が発生したファイルを何度SJISで保存し直してもWinMergeでのエラーは解消しなかったが、文字コードセットの CP にチェックをいれると、以下のようにCP932が選択できるようになる。
そしてCP932で保存をするとWinMergeで怒られていた内容と同じようなことを言われる。
ただし、WinMergeと異なるのは、このままキャンセルを選択すれば、原因となっている箇所へジャンプができるという点だ。
あとは、該当箇所を削除するなり、もとのアプリケーションを訂正するなりすれば、WinMergeでのエラーも解消する。
まとめ
- WinMergeはファイルを CP932(ShiftJIS)* に変換して比較をしている。
- CP932 と ShiftJIS は≒(ニアイコール)の関係であり、相互変換をした場合に情報が欠落する場合がある。
- サクラエディタでCPのチェックを入れいると、文字コードをコードページ指定で選択でき、保存することができる。