IVSとGSUBはどう違うのか

  • 異体字シーケンス(IVS)の特徴について、OpenTypeフィーチャのグリフ置換(GSUB)と比較しながら考えてみた。重要だと思われる点をメモしたものであり、IVSの体系的な説明ではない。
  • IVSは文字コードのレベルの枠組みなので、異体字の情報をプレーンテキストで交換できる。この最大の特徴に加え、GSUBよりも新しい分、よりすっきりとした論理的な仕組みになっている*1
  • IVSの概念は、下図のようなかんじ。符号位置に包摂される複数のグリフ(集合)のなかから、ある特定のグリフ(集合)をVSによって指定する、というイメージ*2


  • 上図はUnicodeの視点から描いたものだが、Adobe-Japan1フォントではデフォルトのグリフはcmapで指定されているので、実装としては下図のようなかんじ。IVSでは、原則として基底文字(親字)の包摂範囲を超えたグリフは指定できないので、VSを付けることによって「區」が「区」になったり「区」が「區」になったりすることはない。


  • VSは「default ignorable」であり、IVS非対応アプリはVSを無視する。このとき、「別の字」に化けることがないよう、「基底文字の包摂範囲を超えない」という条件が必要となる。*3
  • 一方GSUBは、下図のようなイメージ。たとえばInDesignで「区」にtrad(旧字体)タグを付けると、見た目は「區」という「別の字」になる。


  • 「区」の図のまとめ。IVSは、非対応フォントや非対応アプリで表示しても、原則として「文字」のレベルで化けることはない。
  • 「辻」のIVS(下図)。Pr6フォントとPr6Nフォントではデフォルトのグリフが異なるが、VSを付ければ、その違いは消える。Pr6でもPr6Nでも、U+E0100が付いてれば一点しんにょうになり、U+E0101が付いてれば二点しんにょうになる。


  • 「辻」のGSUB(下図)。GSUBは、グリフを「特定する」というよりは「変える」発想であり、デフォルトの(置換されていない)グリフを明示的に指定する手段がない。このためGSUBでは、フォントをPrNからPr6Nに(あるいはPr6NからPrNに)変えたときのグリフのブレを避けられない。


  • Adobe-Japan1のIVDコレクションにフル対応したフォント間なら、(実際にやるかどうかはともかく)「すべての漢字にVSを付ける」という運用をした場合、「フォントを変えてもグリフが変わらない」という世界が実現する。
  • 「辻」の図のまとめ。GSUBは(発想としては)グリフを「変える」仕組みだが、IVSはグリフを「特定する」(字形の範囲を限定する)仕組みであり、フォントの変更に強い*4
  • 「骨」のIVS(下図)。Adobe-Japan1には、「骨」のグリフは1つしかないので、VSを付けてもグリフは変わらない。それでも「骨」のためのIVSが用意されている。この話はややこしくなりそうなのでここでは深追いしないが、IVDコレクションとしてのAdobe-Japan1と汎用電子の違いを考える上で重要なポイントだと思う。


  • 「骨」の図のまとめ。コレクション中に異体字のないグリフに対しても、IVSを与えることができる。
  • 「櫛」のIVS(下図)。IVSではCJK互換漢字(下図ではU+2F8ED)は基底文字(親字)になれない。したがって、IVSはUnicode正規化によって置換されてしまうことがない。


  • ちなみに「櫛」のGSUBは、下図のようなかんじ。CJK互換漢字も親字になる*5


  • 「櫛」の図のまとめ。IVSは、非対応アプリによって無視されることはあっても、データとして置き換えられてしまうリスクは(CJK互換漢字よりは)小さい。
  • GSUBにおける漢字の扱いは、まだUnicodeが存在しなかった時代のしがらみを引きずっており、また、JISのたび重なる変更などのとばっちりを食って、化け物のように複雑化している。その点IVSは、(これまで見てきた図からもわかるように)シンプルにできている。では、IVSによって明るい未来が開かれるのだろうか。次回「IVSの問題点」(仮)に続く。

*1:といっても、IVSによって表現できるのは漢字の異体字だけなので、GSUBに取って代われるわけではない。

*2:今回掲載した図におけるIVDコレクションは、すべてAdobe-Japan1(汎用電子は含まない)。

*3:実は例外もあるのだが、今回はその話は割愛。

*4:GSUBのaaltは2系統のテーブルが存在して、これが文字化けの原因になるが、IVSのテーブルは安定しているので、aaltと比較してフォントの変更に強い、という側面もある。

*5:ただし、GSUBはもともと非対応アプリに持っていくことはできないので、Unicode正規化の影響を考慮する必要は特にない。