見た目が同じなのに一致しない文字。濁点の分解と、全角・半角

文字化け・文字コードのコラム

「ガ」で検索したのに、画面に見えている「ガ」がヒットしない。
コピーして貼り付けた文字列が、目視では同じなのにプログラムでは別物と判定される。

文字化けとは違い、見た目は正常です。それでも一致しない。
このとき起きているのは、文字コードの違いではなく、Unicodeの表し方の違いです。

「ガ」には2通りの書き方がある

Unicodeでは、濁点付きのカナを2通りで表せます。

  • 1文字として持つ(「ガ」で1文字)
  • 「カ」と濁点を並べて持つ(2文字)

どちらも画面上は「ガ」に見えます。
ですが、文字数を数えると1と2で違いますし、文字列として比較すると一致しません。

前者を合成済み、後者を分解済みと呼びます。
macOSはファイル名を分解済みで扱ってきた歴史があるため、Macで作ったファイル名をWindowsやLinuxに持っていくと、この差が表面化することがあります。

全角と半角も同じ問題

同種の現象は、濁点以外にもあります。

  • 全角の「A」と半角の「A」
  • 全角の「1」と半角の「1」
  • 半角カナの「カ」と全角の「カ」

これらは見た目こそ違いますが、意味としては同じものを指しています。
検索や照合の場面では「同じ扱いにしたい」ことが多く、そのままだと一致しません。

どこで困るか

この違いが表面化するのは、人が目で読むときではありません。機械が比較するときです。

  • ファイル名で検索しても、目的のファイルが出てこない
  • 表計算で名前を突き合わせたら、同じはずの行が一致しない
  • テキスト検索をかけても、画面に見えている語がヒットしない

いずれも「見えているのに一致しない」という形で出るため、原因にたどり着くまで時間がかかります。
文字数が想定と違う場合は、この現象を疑う手がかりになります。

揃える操作を正規化と呼ぶ

これらを統一する処理が正規化です。
方式がいくつかあり、どこまで同一視するかが変わります。

濁点の合成・分解だけを揃える方式なら、文字の情報は失われません。
一方、全角英数を半角に寄せる方式は、変換の過程で情報を落とします。「①」が「1」になり、丸囲みだった事実が消えます。

どちらを使うかは用途次第です。
検索用のキーを作るなら後者が便利ですが、原文をそのまま保存したい場面では使えません。

文字コードの変換では直らない

注意点として、これは文字コードの問題ではありません。
UTF-8とShift_JISを変換しても、濁点の分解は解消しません。

MojiRescueが行っているのも文字コードの変換なので、この現象には対応していません。
「化けてはいないのに一致しない」という症状が出たら、変換ではなく正規化のほうを疑ってください。

コピペしたテキストの文字化けを診断・復元

MojiRescueなら、化けたテキストを貼り付けるだけで原因を自動判定し、可能な限り元の日本語に復元します。

診断ツールを使う