見た目が同じなのに一致しない文字。濁点の分解と、全角・半角
文字化け・文字コードのコラム
「ガ」で検索したのに、画面に見えている「ガ」がヒットしない。
コピーして貼り付けた文字列が、目視では同じなのにプログラムでは別物と判定される。
文字化けとは違い、見た目は正常です。それでも一致しない。
このとき起きているのは、文字コードの違いではなく、Unicodeの表し方の違いです。
「ガ」には2通りの書き方がある
Unicodeでは、濁点付きのカナを2通りで表せます。
- 1文字として持つ(「ガ」で1文字)
- 「カ」と濁点を並べて持つ(2文字)
どちらも画面上は「ガ」に見えます。
ですが、文字数を数えると1と2で違いますし、文字列として比較すると一致しません。
前者を合成済み、後者を分解済みと呼びます。
macOSはファイル名を分解済みで扱ってきた歴史があるため、Macで作ったファイル名をWindowsやLinuxに持っていくと、この差が表面化することがあります。
全角と半角も同じ問題
同種の現象は、濁点以外にもあります。
- 全角の「A」と半角の「A」
- 全角の「1」と半角の「1」
- 半角カナの「カ」と全角の「カ」
これらは見た目こそ違いますが、意味としては同じものを指しています。
検索や照合の場面では「同じ扱いにしたい」ことが多く、そのままだと一致しません。
どこで困るか
この違いが表面化するのは、人が目で読むときではありません。機械が比較するときです。
- ファイル名で検索しても、目的のファイルが出てこない
- 表計算で名前を突き合わせたら、同じはずの行が一致しない
- テキスト検索をかけても、画面に見えている語がヒットしない
いずれも「見えているのに一致しない」という形で出るため、原因にたどり着くまで時間がかかります。
文字数が想定と違う場合は、この現象を疑う手がかりになります。
揃える操作を正規化と呼ぶ
これらを統一する処理が正規化です。
方式がいくつかあり、どこまで同一視するかが変わります。
濁点の合成・分解だけを揃える方式なら、文字の情報は失われません。
一方、全角英数を半角に寄せる方式は、変換の過程で情報を落とします。「①」が「1」になり、丸囲みだった事実が消えます。
どちらを使うかは用途次第です。
検索用のキーを作るなら後者が便利ですが、原文をそのまま保存したい場面では使えません。
文字コードの変換では直らない
注意点として、これは文字コードの問題ではありません。
UTF-8とShift_JISを変換しても、濁点の分解は解消しません。
MojiRescueが行っているのも文字コードの変換なので、この現象には対応していません。
「化けてはいないのに一致しない」という症状が出たら、変換ではなく正規化のほうを疑ってください。
コピペしたテキストの文字化けを診断・復元
MojiRescueなら、化けたテキストを貼り付けるだけで原因を自動判定し、可能な限り元の日本語に復元します。