結合文字列をUnicode正規化で合成する方法の危険性

  • 41
    Like
  • 2
    Comment

ここで扱うこと

結合文字列を解消する目的でUnicode正規化形式のNFCを適用する方法がよく紹介されています。このように合成を目的としてNFCを利用するのは大変に危険です。なにが危険なのかを説明します。

用語の選定

Unicode標準とUCS(ISO/IEC 10646)は用語体系が異なります。その違いがここでは深刻な影響を与えるため、慎重に用語の選定をしなければいけません。ここで扱う問題はUCSの用語では説明不可能なので、Unicode標準の用語を選びます。

Unicode標準では「合成」を「結合文字列から合成済み文字にすること」のみを指します。

UnicodeStandard.png

なにが危険なのか

NFCが合成だけをするのならいいのですが、それだけではなく、意図しないところで別の文字に変わってしまう現象が発生します。とくに漢字でそれが大量に発生します。下図はその一例。

NFC

このようにNFCを適用すると、別の漢字に変わってしまいます。NFCだけでなく、Unicode正規化ではどの形式でもこの現象が発生します。対象となる文字は CompositionExclusions.txt にまとめられています。この中の日本語の漢字は人名で使われているものが多く、それが別の漢字に変わってしまうのは深刻な事態を招きます。

Unicode正規化は、そもそもバックグラウンドでの文字列照合で使われる処理であって、テキスト文字列を整形するためのものではありません。安易に利用しないようにしましょう。

それではどうしたらいいのか

結合文字列を合成する安全な方法を考える で考察してみました。