Unicode とのマッピング情報を使う
Adobe-Japan1 ではない CID フォントを、Adobe-Japan1 に変換するためには、それぞれの CID に、何の文字のグリフが割り当てられているかという情報が必要になります。
例えば、'あ' という文字のグリフが、Adobe-Japan1 で CID 843、源ノ角ゴシックで CID 1461 であれば、作成するフォントの CID 843 に、源ノ角ゴシックの CID 1461 のグリフを割り当てればよいということになります。
例えば、'あ' という文字のグリフが、Adobe-Japan1 で CID 843、源ノ角ゴシックで CID 1461 であれば、作成するフォントの CID 843 に、源ノ角ゴシックの CID 1461 のグリフを割り当てればよいということになります。
フォント内の情報
各フォント内には、cmap というテーブルに、Unicode とグリフ (GID) とのマッピング情報が存在します。
例えば、「U+0020 は GID 1」というように、Unicode のコード値から、フォント内のグリフを取得するための情報となります。
(Unicode 以外の文字コードとのマッピングが含まれている場合もあります)
GID というのは、「グリフインデックス」です。
フォント内のグリフデータは、隙間なく連続して格納されており、GID は、そのデータ内の番号(インデックス)を表しています。
GID は、CID とはまた別の番号となり、フォント内のデータにおいては、グリフを表す番号として使われます。
(すべての CID に対して、実際にグリフが存在する場合は、CID = GID となります)
源ノフォントの場合は、CJK すべての各グリフに対して、それぞれ CID が割り当てられていますが、サブセットフォントにおいては、その中の一部のグリフを使うことになるので、実際にはフォントに含まれていない CID が存在することになります。
そのような場合は、グリフに対する CID と GID の番号が異なります。
例えば、「U+0020 は GID 1」というように、Unicode のコード値から、フォント内のグリフを取得するための情報となります。
(Unicode 以外の文字コードとのマッピングが含まれている場合もあります)
GID というのは、「グリフインデックス」です。
フォント内のグリフデータは、隙間なく連続して格納されており、GID は、そのデータ内の番号(インデックス)を表しています。
GID は、CID とはまた別の番号となり、フォント内のデータにおいては、グリフを表す番号として使われます。
(すべての CID に対して、実際にグリフが存在する場合は、CID = GID となります)
源ノフォントの場合は、CJK すべての各グリフに対して、それぞれ CID が割り当てられていますが、サブセットフォントにおいては、その中の一部のグリフを使うことになるので、実際にはフォントに含まれていない CID が存在することになります。
そのような場合は、グリフに対する CID と GID の番号が異なります。
手順
1. Adobe-Japan1 の各 CID において、割り当てられている Unicode 値を取得 (dst-cid = uc)
2. 変換元フォント (源ノフォント) のマッピング情報から、(1) の Unicode を元に、元フォントでの CID を取得 (src-cid = uc)
3. 見つかった場合、変換先の CID に、変換元の CID をセット (dst-cid = src-cid)
2. 変換元フォント (源ノフォント) のマッピング情報から、(1) の Unicode を元に、元フォントでの CID を取得 (src-cid = uc)
3. 見つかった場合、変換先の CID に、変換元の CID をセット (dst-cid = src-cid)
必要なファイル1
まず、変換元の源ノフォントの cmap テーブルから、Unicode と CID のマッピング情報を取得します。
ここでは、AFDKO に含まれる spot コマンドを使って、テキストで取得します。
以降では、源ノ角ゴシック Regular のフォントを変換するものとして、説明していきます。
以下のコマンドを実行してください。
上記の場合、U+0020 は \1 = CID 1 に割り当てられている、ということになります。
また、[ ] 内で、Unicode の数値が2つ並んでいる場合は、異体字の指定となります。
異体字というのは、漢字や記号などで、意味は同じだが、字形が微妙に異なる文字のことです。
ベースとなる文字の Unicode の後に、異体字用の Unicode 値 (U+FE00 など) を指定すると、プログラム側で、指定された字形のグリフに出力されます。
ただし、異体字に対応していないプログラムでは、異体字は出力されません。
なお、複数の Unicode で、同じグリフが割り当てられている場合があります。
Unicode が異なっても、字形が同じであれば、同じグリフが割り当てられます。
ここでは、AFDKO に含まれる spot コマンドを使って、テキストで取得します。
変換元の源ノフォントは、.otf ファイルを使ってください (.otc ではない)。
また、日本語サブセットのフォントを使ってください。
源ノ角ゴシックなら、SourceHanSansJP-*.otf。
源ノ明朝なら、SourceHanSerifJP-*.otf。
また、日本語サブセットのフォントを使ってください。
源ノ角ゴシックなら、SourceHanSansJP-*.otf。
源ノ明朝なら、SourceHanSerifJP-*.otf。
以降では、源ノ角ゴシック Regular のフォントを変換するものとして、説明していきます。
以下のコマンドを実行してください。
$ spot -t cmap=7 SourceHanSansJP-Regular.otf > cmap.txt
spot コマンド
spot コマンドは、OpenType/TrueType の各テーブルの情報を、テキストで出力します。
(各テーブルの情報を元に、PostScript で、グリフのアウトラインを出力することもできます)
結果は標準出力に出力されるので、リダイレクトでファイルに保存してください。
ここでは、cmap.txt ファイルに出力します。
-t で出力するテーブル名を指定し、=N で、出力する情報の詳細を指定します。
cmap=7 は、cmap テーブル内の、Unicode とグリフの割り当て情報を、Unicode 16 進数と、グリフ名または CID で出力します。
フォントの実際のデータでは、グリフは GID の値となっていますが、spot コマンドなどでは、自動で GID → CID の変換を行ってくれます。
グリフを GID で取得したい場合は、"-t map=5" にします。
(各テーブルの情報を元に、PostScript で、グリフのアウトラインを出力することもできます)
結果は標準出力に出力されるので、リダイレクトでファイルに保存してください。
ここでは、cmap.txt ファイルに出力します。
-t で出力するテーブル名を指定し、=N で、出力する情報の詳細を指定します。
cmap=7 は、cmap テーブル内の、Unicode とグリフの割り当て情報を、Unicode 16 進数と、グリフ名または CID で出力します。
フォントの実際のデータでは、グリフは GID の値となっていますが、spot コマンドなどでは、自動で GID → CID の変換を行ってくれます。
グリフを GID で取得したい場合は、"-t map=5" にします。
出力
--- encoding[0] platformId=0 scriptId =3 languageId=0 --- [code]=<name/CID> [0020]=<\1> [0021]=<\2> ... [4FAE FE00]= <\58912> ...
上記の場合、U+0020 は \1 = CID 1 に割り当てられている、ということになります。
また、[ ] 内で、Unicode の数値が2つ並んでいる場合は、異体字の指定となります。
異体字というのは、漢字や記号などで、意味は同じだが、字形が微妙に異なる文字のことです。
ベースとなる文字の Unicode の後に、異体字用の Unicode 値 (U+FE00 など) を指定すると、プログラム側で、指定された字形のグリフに出力されます。
ただし、異体字に対応していないプログラムでは、異体字は出力されません。
なお、複数の Unicode で、同じグリフが割り当てられている場合があります。
Unicode が異なっても、字形が同じであれば、同じグリフが割り当てられます。
必要なファイル2
次に、変換先の、Adobe-Japan1 の CID と Unicode の割り当て情報が必要になります。
Adobe-Japan1 については、割り当て情報がファイルとして存在するので、それを使います。
https://github.com/adobe-type-tools/cmap-resources
- Adobe-Japan1-*/CMap/UniJIS2004-UTF32-H
いくつかファイルがありますが、UniJIS2004-UTF32-H をダウンロードしてください。
この時点においては、他のファイルは必要ありません。
指定ファイルのページを開いた後、ソースの右上にある「Raw」ボタンの上を右クリックして、「名前を付けてリンク先を保存」すると、個別にファイルをダウンロードできます。
begincidchar〜endcidchar、または、begincidrange〜endcidrange の間が、必要な情報となります。
なお、begin* の前の数字は、そのブロックに含まれている項目の数です。
cidchar の場合は、< > 内が Unicode、右が CID となります。
cidrange の場合は、2つの < > が、Unicode の範囲の先頭値と、終端値です。右が CID の先頭値です。
Adobe-Japan1 については、割り当て情報がファイルとして存在するので、それを使います。
https://github.com/adobe-type-tools/cmap-resources
- Adobe-Japan1-*/CMap/UniJIS2004-UTF32-H
いくつかファイルがありますが、UniJIS2004-UTF32-H をダウンロードしてください。
この時点においては、他のファイルは必要ありません。
指定ファイルのページを開いた後、ソースの右上にある「Raw」ボタンの上を右クリックして、「名前を付けてリンク先を保存」すると、個別にファイルをダウンロードできます。
ファイルの中身
... 100 begincidchar <0000005c> 97 <0000007c> 99 <0000007d> 94 ... endcidchar ... 100 begincidrange <00000020> <0000005b> 1 ... endcidrange
begincidchar〜endcidchar、または、begincidrange〜endcidrange の間が、必要な情報となります。
なお、begin* の前の数字は、そのブロックに含まれている項目の数です。
cidchar の場合は、< > 内が Unicode、右が CID となります。
cidrange の場合は、2つの < > が、Unicode の範囲の先頭値と、終端値です。右が CID の先頭値です。
必要なファイル3
UniJIS2004-UTF32-H のファイルでは、異体字の Unicode とのマッピング情報は含まれていないので、別途、異体字用の割り当て情報が記されたファイルが必要になります。
Adobe-Japan1_sequences.txt をダウンロードしてください。
https://github.com/adobe-type-tools/Adobe-Japan1
- Adobe-Japan1_sequences.txt
上記のサイトでは、Adobe-Japan1 に関するファイルがあります。
Adobe-Japan1-7.pdf では、CID とグリフの一覧を見ることができます。
このサイトのファイルに関しては、この後の処理でも、いくつか必要になるファイルがあるので、まとめてダウンロードしても構いません。
左が異体字の Unicode、CID+ の数値が CID です。
Adobe-Japan1_sequences.txt をダウンロードしてください。
https://github.com/adobe-type-tools/Adobe-Japan1
- Adobe-Japan1_sequences.txt
上記のサイトでは、Adobe-Japan1 に関するファイルがあります。
Adobe-Japan1-7.pdf では、CID とグリフの一覧を見ることができます。
このサイトのファイルに関しては、この後の処理でも、いくつか必要になるファイルがあるので、まとめてダウンロードしても構いません。
ファイルの中身
3402 E0100; Adobe-Japan1; CID+13698 3402 E0101; Adobe-Japan1; CID+13697 ...
左が異体字の Unicode、CID+ の数値が CID です。
スクリプトで処理
Python3 スクリプトで、Unicode とのマッピング情報を元にした、CID の再割当てを行うプログラムを作ったので、こちらを使ってください。
ここまでで用意した各ファイルを指定すれば、自動で、Adobe-Japan1 の CID に対して、変換元の CID を割り当てることができます。
>> remap-unicode.py
(右クリックで、名前を付けて保存してください)
py ファイルに実行属性を付けると、実行ファイルと同じ扱いで実行できます。
実行属性を付けない場合は、python コマンドに、スクリプトファイルを渡す形で実行してください。
出力されたファイルの中身は、作業用としての独自の形式で、上記のようになっています。
左の数値が、Adobe-Japan1 の CID (10進数)。
次の [ ] 内が、変換先の CID に割り当てられる、変換元の CIDです。
[] がない場合は、割り当てられるグリフなしとなります。
'#' 以降は、Adobe-Japan1 において、その CID に割り当てられている Unicode 値 (16進数) です。
複数ある場合は、'/' で区切られます。空白が含まれる場合は、異体字です。
この状態でも、かなり多くのグリフが割り当てられていますが、まだ割り当てられていないグリフが残っているため、次の処理へと続きます。
ここまでで用意した各ファイルを指定すれば、自動で、Adobe-Japan1 の CID に対して、変換元の CID を割り当てることができます。
>> remap-unicode.py
(右クリックで、名前を付けて保存してください)
$ python3 remap-unicode.py cmap.txt UniJIS2004-UTF32-H Adobe-Japan1_sequences.txt > out1.txt または、 $ chmod +x remap-unicode.py $ ./remap-unicode.py cmap.txt UniJIS2004-UTF32-H Adobe-Japan1_sequences.txt > out1.txt
py ファイルに実行属性を付けると、実行ファイルと同じ扱いで実行できます。
実行属性を付けない場合は、python コマンドに、スクリプトファイルを渡す形で実行してください。
使い方
1番目の引数は、spot -t map=7 で出力したファイル。
2番目は、UniJIS2004-UTF32-H のファイル (省略で 'UniJIS2004-UTF32-H')。
3番目は、Adobe-Japan1_sequences.txt のファイルを指定してください (省略で 'Adobe-Japan1_sequences.txt')。
py ファイルと同じ場所に各ファイルを置いた場合、2番目以降のファイル指定は省略できます。
標準出力に結果が出力されるので、リダイレクトでファイルに保存してください。
ここでは、out1.txt とします。
2番目は、UniJIS2004-UTF32-H のファイル (省略で 'UniJIS2004-UTF32-H')。
3番目は、Adobe-Japan1_sequences.txt のファイルを指定してください (省略で 'Adobe-Japan1_sequences.txt')。
py ファイルと同じ場所に各ファイルを置いた場合、2番目以降のファイル指定は省略できます。
標準出力に結果が出力されるので、リダイレクトでファイルに保存してください。
ここでは、out1.txt とします。
出力結果
Adobe-Japan1 での CID 数と、そのうちの割り当てられた数、そして、その%が表示されます。
この段階で、Adobe-Japan1-7 の 71% のグリフが埋まりました。
(ここでは、「令和」の縦書きの CID 23059 が含まれていないので、正確には1個少ないです)
16431/23059 (71.26%)
この段階で、Adobe-Japan1-7 の 71% のグリフが埋まりました。
(ここでは、「令和」の縦書きの CID 23059 が含まれていないので、正確には1個少ないです)
ファイルの中身
00001[1]#A0/20 00002[2]#21 00003[3]#22 ... 23057[47491]#9FA3 E0100 23058[2184]#32FF
出力されたファイルの中身は、作業用としての独自の形式で、上記のようになっています。
左の数値が、Adobe-Japan1 の CID (10進数)。
次の [ ] 内が、変換先の CID に割り当てられる、変換元の CIDです。
[] がない場合は、割り当てられるグリフなしとなります。
'#' 以降は、Adobe-Japan1 において、その CID に割り当てられている Unicode 値 (16進数) です。
複数ある場合は、'/' で区切られます。空白が含まれる場合は、異体字です。
この状態でも、かなり多くのグリフが割り当てられていますが、まだ割り当てられていないグリフが残っているため、次の処理へと続きます。