FontForge で調べたことのメモ
注意: 網羅的でも体系的でも無いです.
あるコードポイントの文字を別のコードポイントのグリフに置き換える
実現するためには GSUB テーブルを使う.GSUB テーブルについては下表が分かりやすいかな? (引用元) FontForge では GSUB テーブルを編集できる.
| name | 読み込みサポート |
|---|---|
| 単純置換 (単独置換) | あるグリフを別のグリフに、機能タグごとに定められた文脈の下で変更することができ。 |
| 複数置換 | 1 個のグリフを別のグリフの列に置換することができます。これは一般的に、かなり技術的なレイアウトの作業に使用されます。 |
| 選択肢つき置換 | 一連の“選択肢”を各グリフに持たせることができます。よくある一例としては、イタリックフォントの各大文字に、数種類のスワッシュ変種がある例でしょう。 |
| 合字置換 | 複数のグリフの並びを別の 1 個のグリフに置き換えることができます。 |
| 文脈依存の置換 | このサブテーブルでは、複数のグリフの並びを別のグリフの並び (またはグリフの並びのクラス) に置き換えることができます |
| 文脈連鎖依存の置換 | これは上記の機能のより複雑なバージョンで、実際には本当に新しい機能を追加するものではありませんが、同じ事柄に対するより論理的なアプローチを提供しています。 |
| 拡張置換 | これは、GSUB テーブルが 64K より大きいときに使用します。これを使っていることは、フォントデザイナーからはまったく見えないようになっているべきです。 |
| 逆順・連鎖型文脈依存の単独置換 | これを使うと、グリフ置換を逆順に行うことができます。これは連鎖型文脈置換サブテーブルの変種です。 |
| 将来の使用のために予約 |
あるコードポイントの文字を,別のコードポイントのグリフに置き換えるには,1番目または2番目の設定を使う.僕のしたかったことは濁点の付いた字を,濁点がつく前の字と濁点の組み合わせで表示してほしかった.例えば U+30BE ゾ = U+3099 ゛ + U+30BD ソ みたいな感じ.あるいは U+309B ゛ + U+30BD ソ でも良いんだけど.
でも実は GSUB テーブルの複数置換を設定するためには,そのコードポイントにグリフを登録して,フォントにその字が収録された状態にしないといけない.つまり例えば U+30BE ゾ にグリフを収録しないまま,複数置換を設定することは出来ないっぽい.だったら最初から ゾ のグリフを作って収録するよね… どうしてこういう仕様なんだろ.
Unicode 正規化: 特に NFD と NFC
僕が最近作ったフォントには濁点を持つカタカナのグリフを登録してない.でもソフトウェアによっては濁点を含む文字を表示することができる!僕が試した感じテキストエディタの Atom と,Libre Office Write では,ゾとかボとか,フォントには収録してない濁点を含む字を問題なく表示してくれた (Inkscape は表示してくれなかった…).
ツイートにも書いた通り, U+3099 の濁点がグリフとして収録されていると,勝手に気を利かせて U+30BE ゾ = U+3099 ゛ + U+30BD ソ みたいなことをやってくれるソフトウェアがあるようだ.こういうのは (たぶん) Unicode 正規化という使用により実現されているんだと思う.
| 略号 | 名称 (EN) | 説明 |
|---|---|---|
| NFD | Normalization Form Canonical Decomposition | 文字は正準等価性によって分解される。 |
| NFC | Normalization Form Canonical Composition | 文字は正準等価性によって分解され、再度合成される。結果として文字の並びが変換前と変わることもありうる。 |
| NFKD | Normalization Form Compatibility Decomposition | 文字は互換等価性によって分解される。 |
| NFKC | Normalization Form Compatibility Composition | 文字は互換等価性によって分解され、正準等価性によって再度合成される。 |
UFD と UFC のどっちが利いて U+30BE ゾ = U+3099 ゛ + U+30BD ソ が達成されてるのかよく分からないんだけど,とにかくうまく表示してくれる.どちらかと言うと UFC が利いてるっぽいかな… 分解してから再度結合する,という説明が,Atom とか Libre Office Writer で起こったことに近い気がする.
