« 2006年02月02日 | メイン | 2006年02月04日 »

2006年02月03日

PDFと文字 (40) – Unicode標準形式NFCの問題点

昨日までで、Unicodeの標準形式NFCを使えば結合文字列を合成できそうなことは分かりました。しかし、便利なものには落とし穴もあるもの。NFCにもなにか問題があるに違いありません。

そこで、仕様書を少し詳しく検討してみましたところ、気になる点が出てきました。
(1) 合成除外文字の問題、特に、CJK互換漢字が別の文字に置換されてしまう件。
(2) Unicodeにコードポイントを持たない文字を指定したときの問題。
の二つです。

一方、ハングルの字母(Jamo)で表されたテキストをUnicode標準形NFCにすることで、ハングル合成文字(Johab)に変換できるというメリットもあるようです。

2006年01月18日PDFと文字(26) – ハングルの扱いで、ハングル音節文字(Johab)は字母からプログラムで合成できると書きましたが、Jamoの列を標準形式NFCにすることで、これが実現できてしまうんですね。

順番に検討してみます。

(1) 合成除外文字の問題について

Unicode文字列の標準形NFCの作成では、文字列をまず正規分解し、次に正規合成します。ところが、この処理は完全なラウンドトリップ変換ではありません。つまり出発点に戻らない文字があります。

UAX#15に合成除外文字のリスト(Composition Exclusion Table)が用意されています。これを見ますと、合成除外文字には幾つかの種類がありますが、一番問題になりそうなのが、正規分解でそれ自身とは異なる一文字になってしまう文字です。これはSingletonと言います。

Singletonの例としてUAX#15にはオングストローム記号が出てきます。オングストローム記号は、上リング記号付きラテン大文字Aへの分解マッピングを持っています。さらに、NFDでは<U+0041, U+030A>になります。ところがSingletonは合成除外文字に指定されているため、オングストローム記号のNFCをとっても元に戻りません(次の図を参照)。
Singleton.PNG

もし、万一、指定したフォントでオングストローム記号と、上リング記号付きラテン大文字Aのグリフが違っていると、NFCを取る場合とNFCを取らない場合で表示される字形が異なってしまうという問題が生じます。オングストローム記号をわざわざU+212Bで表す数奇者はいないと思いますが。それなら、Unicodeは、なぜ、オングストローム記号にコードポイントを与えたのでしょうか?

オングストローム記号程度なら良いのですが、Singletonのリストの中に漢字が997文字もあります。
Composition Exclusion Tableには、Singletonの合計コードポイントは924となっていますが、漢字だけで997文字もありますから、924は誤りでしょう。

997文字は全部CJK互換漢字のブロックの文字です。
※CJK互換漢字については、2006年01月04日 PDFと文字(15) – CJK統合漢字拡張を参照してください。

CJK互換漢字(U+F900~U+FAFF)のブロックは、12文字(U+FA0E, U+FA0F, U+FA11, U+FA13, U+FA14, U+FA1F,U+FA21, U+FA23, U+FA24, U+FA27, U+FA28, U+FA29)を除く残りがSingletonになっています。また、CJK互換補助漢字(U+2F800~U+2FA1D)はすべてがSingletonになっています。これらの文字は標準形式NFCにするとCJK統合漢字に置き換わってしまいます

ちなみに、JIS X0213 とのラウンドトリップ用にコードポイントをもつU+FA30~U+FA6Aの59文字もCJK統合漢字への正規分解マッピングを持っていますのでNFCで文字が置換されてしまいます。

実際にどうなるか見てみましょう。

こんどは、Normalization Conformance Testのデータに、フォント・ファミリーをMS明朝を指定してPDF化してみます。最初が標準形NFCにしない場合、次が標準形NFCにした場合です。

図 標準形NFCにしない場合
U+FA30.PNG

図 標準形NFCにした場合
U+FA30-NFC.PNG

これを見ますと、現在の時点では、MS明朝では、U+FA30~U+FA6Aの文字にはグリフがないことがわかります。これをNFCにしますと文字が表示されるようになります。

Windows Vistaでは、MS明朝にJIS X 0213の文字のグリフが追加されるようですので、そうなると、Unicode標準形NFCにすると字形の置換が現実に起きてしまうのではないかと思います。

投票をお願いいたします

投稿者 koba : 08:00 | コメント (0) | トラックバック