Unicode正規化 その2 (2009.7.30 改訂)

複数の文字をくっつけて1文字と見なす「結合文字の並び」ですが、これを本当に「ちゃんと1文字として表示する」のは、実はかなり難しいことのようです。

“結合文字の並び” を1文字に表示するには

まずなにより、OS 自体にその能力が必要です。はじめてこれを実現したのが Mac OS X です。Windows も Vista でその能力を持つようになりました。

次に、文字を表示するソフトウェアにもその能力が必要です。そしてさらに、フォントもその技術に対応していなければなりません。

つまり「OS」「ソフトウェア」「フォント」の3つが、揃って対応している時にだけ “結合文字の並び” を1文字に表示することができるわけです。

さて、“結合文字の並び” が困った結果を引き起こすのは、1文字に表示できない場合があるだけではありません。実際には、1文字に表示できるソフトウェアでも困った結果になることがあります。

“結合文字の並び” が引き起こす様々な問題

これはSafariでGoogle検索をした結果です。なんと「パンダ」の検索結果が475件しかありません。実はこの「パンダ」の文字、フォルダ名をコピペしたものです。「パ」と「ダ」が “結合文字の並び” なので、検出されるのは実際に “結合文字の並び” を含んだ「パンダ」か「ハンタ」だけというわけです。OS Xユーザで、このようにアイテム名をコピペしてGoogle検索をしたら、検索結果があまりに少なくて当惑した方も多いのではないでしょうか。また、誰もが魅了される素晴らしいパンダのサイトでも、“結合文字の並び” を含む「パンダ」を使っていたら、アクセスが増えることは期待できません。
:このページを公開した時点では上記の状態でしたが、今のSafariは入力フォームをNFCに正規化して送信しているので、このような結果にはなりません。Safari のツールバーのGoogle検索やFireFox等では上記のような結果になります)

文字検索に関しても、同じ字形なら同じようにヒットすることを、どのソフトウェアでもサポートしているわけではありません。

これはCotEditorで「u」を「A」に一括置換してみたものです。「0075」が検索対象となって置換されてることが分かります。(CotEditorはとてもよくできたエディタです。この置換結果も決して悪い仕様ではないので、低く評価しないようにしてください。私が作るソフトの検索置換機能も同様ですし…)

このように、思いがけない結果になるのが、“結合文字の並び” です。ソフトウェアによっては、その文字が “結合文字の並び” であることを判別できないので厄介です。それでは、どうしたらこれを防ぐことができるのでしょうか。

やはりそれには、“結合文字の並び” を「単一コードの1文字」に変換するしか方法はないと思います。上の例で言うと、結合文字列「ハ+半濁音」を1文字の「パ」に変換するということです。

補注
“結合文字の並び” が実際に1文字に表示されている様子を仔細に見てみると、面白いことが分かります。

これはモリサワの新ゴUで「ホ」と「ポ」を表示したものです。この書体は「ポ」の半濁音が横棒に食い込んでいます。「ホ」と「ポのホ」の形状も微妙に違うデザインになっています。

左右の「ポ」を見てください。左は「単一コードポイント」、右は「結合文字の並び」が表示されている状態です。左右とも字形がまったく同じです。半濁音もちゃんと食い込んでいます。「ホ」と「ポのホ」の形状が微妙に違うところまで同じです。

どうしてここまで見事にまったく同じなのかというと、“結合文字の並び” のポは 30DB+309A の字形を組み合わせて表示しているのではなく、単一コードポイント 30DD の字形をそのまま表示しているのです。両方とも同じなのは当然なんですね。

字形デザインの微妙な違いも反映させて “結合文字の並び” を完璧に1文字に表示するには、たしかにこの方法しかなさそうです。「OS」「ソフトウェア」「フォント」の3つが揃ってこの方法に対応していないとできないのも頷けますね。