PDFの文字エンコーディング
PDFに出力する文字のエンコーディングは一般的なJavaのそれとは全く違うようで、非常にはまっている(混乱している)。
PDFでのエンコーディングってのはフォントで文字の割り当てを決めるのだが、その名前もよく見るIANAの名前とは全く違っていて日本語で使うものの代表的なものだけでも
Identity-H PDF独自のCIDエンコードに準拠してコード付けされたもの。 90ms-RKSJ-H WindowsでのMicrosoftのエンコード。 90pv-RKSJ-H MacintoshのTrue Type(トゥルータイプ)フォント標準のエンコード。 83pv-RKSJ-H MacintoshのPostScriptフォント標準のエンコード。
これだけある。
エンコーディング名のトークンにはそれぞれ以下の意味があり、例えばWindowsで頻繁に使う'90ms-RKSJ-H'であれば
1 2 3 90ms - RKSJ - H ── ── - 文字 符号化 組 セット 方式 方向
1「WindowsでのMicrosoftの文字セット」、2「Romaji Kana Shift JIS(Shift_JIS)」、3「Horizontalつまり横書き」という意味になる訳だ。
まあ、これは良い。和文フォントを使ってPDFに文字を出力する場合"MS ゴシック"等の和文フォントを使った一般的な横書きのPDF文書の場合は'90ms-RKSJ-H'が使われるが、Windows上で日本語ロケールのデフォルトのエンコーディングは'MS932'つまりは'Shift_JIS'であり問題は無い。
ならば、Unicode文字を使ってPDF上Unicode文字を正しく表示する場合はどのフォントを使い、どのエンコーディングにすれば良いのだろうか。
最初の例の通り日本語でPDFを作成して、その中にUnicodeの他国語(CJK統合漢字等)で書かれたテキストをnative2asciiでUnicodeエスケープに変換したローカライズリソースとしてJavaで読み込みUnicodeのままPDFに出力すれば良いのだが、和文のフォントにMSゴシックを使っているので、エンコードは'90ms-RKSJ-H'のままなので本来表示できるUnicodeの他国語文字は化けてしまうのだ。
追記 :
Unicode文字を使う場合の場合、'UniJIS-UCS2-H'というエンコーディングを使えば良いらしいということまでは解ったがこれがWindowsプラットホームではどのフォントに割り付けられているのかが解らない。
jzkeyさんのコメントにもあるが、Unicode用のエンコーディングを使った所でマップされているコードに含まれていない文字は結局表示できないようだ。