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)説明
NFDNormalization Form Canonical Decomposition文字は正準等価性によって分解される。
NFCNormalization Form Canonical Composition文字は正準等価性によって分解され、再度合成される。結果として文字の並びが変換前と変わることもありうる。
NFKDNormalization Form Compatibility Decomposition文字は互換等価性によって分解される。
NFKCNormalization Form Compatibility Composition文字は互換等価性によって分解され、正準等価性によって再度合成される。

UFD と UFC のどっちが利いて U+30BE = U+3099 + U+30BD が達成されてるのかよく分からないんだけど,とにかくうまく表示してくれる.どちらかと言うと UFC が利いてるっぽいかな… 分解してから再度結合する,という説明が,Atom とか Libre Office Writer で起こったことに近い気がする.

コメントを残す

%d人のブロガーが「いいね」をつけました。