ここで扱うこと
結合文字列を解消する目的でUnicode正規化形式のNFCを適用する方法がよく紹介されています。このように合成を目的としてNFCを利用するのは大変に危険です。なにが危険なのかを説明します。
用語の選定
Unicode標準とUCS(ISO/IEC 10646)は用語体系が異なります。その違いがここでは深刻な影響を与えるため、慎重に用語の選定をしなければいけません。ここで扱う問題はUCSの用語では説明不可能なので、Unicode標準の用語を選びます。
Unicode標準では「合成」を「結合文字列から合成済み文字にすること」のみを指します。
なにが危険なのか
NFCが合成だけをするのならいいのですが、それだけではなく、意図しないところで別の文字に変わってしまう現象が発生します。とくに漢字でそれが大量に発生します。下図はその一例。
このようにNFCを適用すると、別の漢字に変わってしまいます。NFCだけでなく、Unicode正規化ではどの形式でもこの現象が発生します。対象となる文字は CompositionExclusions.txt にまとめられています。この中の日本語の漢字は人名で使われているものが多く、それが別の漢字に変わってしまうのは深刻な事態を招きます。
Unicode正規化は、そもそもバックグラウンドでの文字列照合で使われる処理であって、テキスト文字列を整形するためのものではありません。安易に利用しないようにしましょう。
それではどうしたらいいのか
結合文字列を合成する安全な方法を考える で考察してみました。