0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

WinMergeで文字化け!? 半角中点と文字コード誤判定の罠

Posted at

WinMergeで文字化け!? 半角中点と文字コード誤判定の罠

はじめに

Shift_JIS(CP932)で保存されたはずのテキストファイルをWinMergeで比較しようとしたとき、

「エンコーディングエラーにより情報が失われています」

というエラーが表示され、文字化けが発生したことはありませんか?

今回のケースでは、その原因が "半角中点"(0xA5) によるものでした。この記事では、この現象の原因を追いながら、文字コードとツールの仕様の落とし穴について紹介します。


事象の概要

  1. CP932で保存されたテキストファイルに、半角中点(0xA5)を含む
  2. WinMergeでファイルを比較しようとしたところ、エンコーディングエラーが発生
  3. 該当ファイルを編集し、半角中点を削除して再度読み込ませたところ、文字化けが解消

原因の正体

一見、CP932でも0xA5はちゃんと「半角中点」として定義されています。

バイト列 文字 備考
0xA5 半角カタカナの中点

では、なぜエラーになるのか?

その答えは、WinMergeの文字コード自動判定ロジックにあります

キーポイント:0xA5の後続バイト

WinMergeは、ファイルのエンコーディングを自動判別する際に、バイト列のパターンを元にUTF-16などと誤認識することがあります。

例:A5 83

この2バイトが並ぶと、UTF-16BEで見たときは 0xA583 というコードポイントになります。

0xA583 は Unicode の私用領域(PUA)に属しており、環境によっては表示できなかったり、不正扱いされたりします。

その結果、WinMergeは

  • UTF-16BEとして解釈 → 不正なコードポイントと判断
  • 「エンコーディングエラー」として処理を中断、または文字化け

という挙動をしていたわけです。


検証と再現性

実際に以下のような処理で再現できました:

  1. 半角中点を含むCP932ファイルを作成(例:A5 83
  2. WinMerge(特定バージョン)で比較
  3. エラー発生
  4. 半角中点(0xA5)だけ削除 → 正常に比較可能に

つまり、問題は半角中点そのものではなく、その後続バイトとの組み合わせによるUTF-16BE誤判定が原因だったのです。


回避策

  • ファイルの先頭にASCIIコメント等を追加し、誤判定を避ける
  • 半角中点()を全角中点()に置き換える
  • UTF-8(BOM付き)へ一時変換してから比較する
  • 他の比較ツール(例:Beyond Compare、Meld)を使用する

おわりに

文字コードの問題は、一見ただの文字化けに見えても、

  • ツールの仕様
  • 自動エンコーディング判定のアルゴリズム
  • バイト列の偶然の並び

など、複雑な要因が絡んでいることが多いです。

今回のように、**一見普通の文字(中点)**が原因でツールが誤動作するケースもあるので、

「エンコーディングエラーが出たら、ファイルの中身(バイト列)を疑う」

という視点を持っておくと、トラブル対応が格段に楽になります。

この記事が、同じような問題で悩んでいる方の助けになれば幸いです!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?