name テーブル

name テーブル
name テーブルには、フォント名などの文字列が格納されています。
必須テーブルです。
テーブルデータ
フォーマットは2種類ありますが、今のところ format 1 はあまり使われていません。

uint16 formatフォーマット番号。0 or 1
uint16 count文字列データの数
Offset16 stringOffset文字列が格納されている領域の先頭のオフセット位置。
(name テーブルの先頭を 0 とする)
NameRecord nameRecord[count]NameRecord の配列 (各文字列のデータ)。
「platformID < encodingID < languageID < nameID」の順で並んでいる。
format = 1 の場合、以下が続く
uint16 langTagCountLangTagRecord の数
LangTagRecord langTagRecord[langTagCount]LangTagRecord の配列。
言語を文字列で表す場合、各言語の情報。

NameRecord (各文字列のデータ)
uint16 platformIDプラットフォーム ID
uint16 encodingIDエンコーディング ID
uint16 languageID言語 ID
uint16 nameID名前 ID
uint16 length文字列の長さ (バイト数)
Offset16 offset文字列へのオフセット位置 (stringOffset の位置を 0 とする)

platformID などの値により、文字列データのエンコードは異なります。
platformID/encodingID/languageID は、基本的に cmap テーブルで使われるのと同じ値です。

LangTagRecord (各言語のデータ)
uint16言語タグの文字列の長さ (バイト数)
Offset16言語タグの文字列へのオフセット位置 (stringOffset の位置を 0 とする)

言語タグ文字列は、IETF BCP 47 によって定義された言語名。
参考: IETF言語タグ (Wikipedia)

言語タグ文字列は、UTF-16BE でエンコードされています。

NameRecord の languageID が 0x8000 以上の場合、「languageID - 0x8000」の値をインデックス値として、LangTagRecord の配列から読み込んで参照します。
platformID/encodingID/languageID
この値により、各文字列の言語やエンコーディングなどが指定されます。
※ここでは、実際に使われている主な値のみ解説します。

Windows/Mac の両方に対応するため、「platformID = 1, 3」の両方の文字列データが格納されているフォントが多いですが、「platformID = 3 (Windows)」のデータしかない場合もあります。
platformID = 0 (Unicode)
Unicode での文字列です。
encodingID = 0〜3 の場合は 16bit で表現できる文字なので、UTF-16BE エンコーディング。
platformID = 1 (Macintosh)
Mac 用。
文字列のエンコーディングは、encodingID によって異なります。1byte or 2byte エンコーディング。

encodingID は、0 = Roman (ローマ字)、1 = Japanese、ほか。
languageID は、0 = English、11 = Japanese、ほか。
platformID = 3 (Windows)
Windows 用。
Unicode の場合は「encodingID = 1」、シンボルフォントの場合は「encodingID = 0」。
文字列はすべて UTF-16BE エンコーディング。

languageID には、各言語の ID 値が入っています。詳しい値は仕様書で。
英語 = 0x0409
日本語 = 0x0411
nameID
文字列の内容の種類です。
26〜255 は、将来の名前のために予約されています。
256〜32767 は、フォント固有の名前用に予約されています。

0著作権
1フォントのファミリー名。
フォント名に nameID=2 の名前を付加して使われることが多い。
2フォントのサブファミリー名。
"Regular" など、フォントのスタイルを表す名前。
3一意のフォント識別子
4完全なフォント名
5バージョン文字列。
基本的に「Version <number>.<number>」で始まるが、この形式ではない場合もある。
6フォントの PostScript 名
7商標
8製造者
9デザイナーの名前
10説明
11ベンダーの URL
12デザイナーの URL
13ライセンス説明
14ライセンス情報の URL
15予約
16印刷用のファミリー名。
nameID=0 とは異なり、スタイル名は含まない。
フォントが同じでスタイルが異なるものをグループ化したい時に使う。
17印刷用のサブファミリー名。
18(Mac のみ) 互換性のあるフルネーム
19サンプルテキスト。
フォントのサンプル表示時に適した文字列。
20PostScript CID findfont 名
21WWS ファミリー名
22WWS サブファミリー名
23明るい背景パレット (CPAL テーブル)
24暗い背景パレット (CPAL テーブル)
25バリエーションの PostScript 名の接頭語
プログラム
>> 05_name.c

name テーブルの一覧を表示するプログラムです。

フォントファイルを指定すると、「output.txt」に結果を出力します。
(出力が Unicode 文字列を含むため、コンソールのエンコーディングに左右されないように、テキストファイルに UTF-8 で出力します)

ここでは、「platformID = 0、encodingID = 0〜3」と「platformID = 3」の、UTF-16BE 文字列のみ出力します。
フォント名の実際の使われ方
Linux の場合は、「$ fc-list」で出力した fontconfig のフォント一覧と見比べてみると、フォント名とスタイル名の使われ方がわかります。
nameID = 16,17 がない場合
「源ノ明朝」では、以下のようになっています。

[platID:3 | encID:1 | langID:1033 (0x409) | nameID:1 | offset:204]
Source Han Serif

[platID:3 | encID:1 | langID:1033 (0x409) | nameID:2 | offset:236]
Regular

[platID:3 | encID:1 | langID:1041 (0x411) | nameID:1 | offset:2242]
源ノ明朝

[platID:3 | encID:1 | langID:1041 (0x411) | nameID:2 | offset:236]
Regular

languageID = 0x409 が英語での名前、languageID = 0x411 が日本語での名前です。

nameID = 16, 17 の文字列が存在しないため、
フォントのファミリー名は nameID = 1 の「Source Han Serif (源ノ明朝)」となり、
スタイル名は nameID = 2 の「Regular」となります。
nameID = 16,17 がある場合
「源柔ゴシック」の場合は、以下のようになっています。

[platID:3 | encID:1 | langID:1033 (0x409) | nameID:1 | offset:546]
Gen Jyuu Gothic Regular

[platID:3 | encID:1 | langID:1033 (0x409) | nameID:2 | offset:618]
Regular

[platID:3 | encID:1 | langID:1033 (0x409) | nameID:16 | offset:3634]
Gen Jyuu Gothic

[platID:3 | encID:1 | langID:1033 (0x409) | nameID:17 | offset:3682]
Regular

[platID:3 | encID:1 | langID:1041 (0x411) | nameID:1 | offset:3706]
源柔ゴシック Regular

[platID:3 | encID:1 | langID:1041 (0x411) | nameID:16 | offset:3766]
源柔ゴシック

[platID:3 | encID:1 | langID:1041 (0x411) | nameID:17 | offset:3780]
Regular

▼ fc-list の出力

<path>/GenJyuuGothic-Regular.ttf: 源柔ゴシック,Gen Jyuu Gothic,Gen Jyuu Gothic Regular,源柔ゴシック Regular:style=Regular

nameID = 1 では、末尾にスタイル名「Regular」が付加されています。
nameID = 16 では、フォント名のみとなっています。

フォント一覧を表示する際、同じフォントでスタイルが異なるものをグループ化したい場合には、nameID = 16 の文字列を使います。
「フォント名とスタイル」を一つのかたまりとしてリスト化したい場合には、nameID = 1 の文字列を使います。