ttx 和字型檔 'name' 表|OpenType, etc. 創刊

一般來說,字型檔由多張表 (tables) 描述,例如負責字型名稱的 'name'表,字形曲線的 'CFF ' (PS) 和 'glyf' (TT) 表等。ttx 隸屬於開源項目 fontTools,亦被收錄於 Adobe Font Development Kit for OpenType(AFDKO,簡稱 FDK),用以提取字型的資訊表。

本文將簡要介紹 'name' 表。

參見

name - Naming table specification - Typographydocs.microsoft.com图标Font Names Tabledeveloper.apple.com

▍下載、安裝並運行 ttx

造訪 GitHubAdobe 並根據自己的操作系統選擇下載 AFDKO。依照安裝程式的提示執行步驟,完成後,在 Terminal (macOS 和 Linux) 或命令提示字元 (Windows) 中鍵入

ttx -h

並按下 return/enter。如果安裝正確,命令行將會顯示類似如下內容:

usage: ttx [options] inputfile1 [... inputfileN]

    TTX -- From OpenType To XML And Back

    If an input file is a TrueType or OpenType font file, it will be
       dumped to an TTX file (an XML-based text format).
    If an input file is a TTX file, it will be compiled to a TrueType
       or OpenType font file.

    Output files are created so they are unique: an existing file is
       never overwritten.
...

    --with-zopfli Use Zopfli instead of Zlib to compress WOFF. The Python
      extension is available at https://pypi.python.org/pypi/zopfli

▍匯出字型檔的 'name' 表

在命令行中執行

ttx -t 'name' <file>

其中 <file> 代表字型檔路徑,可在輸入完成「ttx -t 'name' 」(注意 ' 後還需一個空白鍵)直接將字型檔拖入命令行。

命令解釋

-t:只提取其後附加的表的內容,當表的代號為 4 個字元時,可省去引號;一般情況下亦可以鍵入雙引號。「-t 'name'」表示提取 'name' 表。如果需要提取多個表,請重複鍵入 -t 開關,例如

ttx -t 'name' -t 'glyf'

如果是 .otc 或 .ttc 檔案,使用 -y 開關。

-y:選擇字型集合中的某一個字型,從 0 開始計數。

以 Roboto Regular (Roboto-Regular.ttf) 為例,執行上述命令後,在原目錄中會生出與該字型檔同主檔名的 .ttx 檔案,在本例中即 Roboto-Regular.ttx。打開該 .ttx 檔案。

檔案內容大致如下:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <ttFont sfntVersion="\x00\x01\x00\x00" ttLibVersion="3.9">
 3
 4   <name>
 5     <namerecord nameID="0" platformID="3" platEncID="1" langID="0x409">
 6       Copyright 2011 Google Inc. All Rights Reserved.
 7     </namerecord>
 8     <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
 9       Roboto
10     </namerecord>    
        ...
47   </name>
48
49 </ttFont>

.ttx 檔案實質為 XML,其內容第 1 行用以標記 XML,第 2 行和第 47 行標記 ttx 信息。

第 4 行和第 47 行(<name> 與 </name>)表示這兩行之間的為 'name' 表 信息

▍名稱紀錄

第 5 行到第 7 行、第 8 行到第 10 行標記了一條名稱紀錄(name record,權且這樣翻譯)。

第 6 行和第 9 行為該名稱紀錄的內容。

第 5 行和第 7 行標記了這條名稱紀錄的

  • 名稱識別符 Name identifier code (nameID)
  • 平台識別符 Platform identifier code (platformID)
  • 平台詳明識別符 Platform-specific 或 Specific identifier code (platEncID 或 encodingID 或 platformSpecificID)
  • 語言識別符 Language identifier code (langID 或 languageID)

有時候還會出現的 length 和 offset,但是我並不知道他們的用途。

▍平台識別符

值可以為 0 到 4。

0 Unicode 平台
1 Macintosh 平台
2 ISO 標準,目前已棄用
3 Windows 平台
4 自定義平台

大多數情況 platformID 只會使用 1 和 3,在這種情況下 macOS 下優先識別 ID 為 1 的紀錄,其次是 ID 為 3。Windows 只識別 ID 為 3 的紀錄。故一些情況下可能可以省略 ID 為 0 的名稱紀錄。

▍平台詳明識別符

platformID 為 0 時,platEncID 可以有如下定義的值

0 Unicode 1.0 semantics (默認 semantics)
1 Unicode 1.1 semantics
2 ISO 10646 1993 semantics,目前已棄用
3 Unicode 2.0 或後續 semantics,僅限基本文平面(U+0000–U+FFFF)
4 Unicode 2.0 或後續 semantics,不限制編碼平面
5 Unicode 变化序列。僅在 'cmap' 中被使用,但本文順帶說明

由於歷史原因,部分字元(主要是韓文相關)編碼在 Unicode 迭代中被移動。

這裡一般選擇 3 或 4。

platformID 為 1 時,platEncID 可以有如下定義的值

0 拉丁字符
1 日文
2 繁體中文
3 韓文
4 阿拉伯文
5 希伯來文
6 希臘文
7 俄文
8 RSymbol
9 天城文
10 錫克教文
11 古吉拉特文
12 奧利雅文
13 孟加拉文
14 坦米爾文
15 泰盧固文
16 卡納達文
17 馬來亞拉姆文
18 僧伽羅
19 緬甸文
20 高棉文
21 泰文
22 老撾文
23 格魯吉亞文
24 亞美尼亞文
25 簡體中文
26 藏文
27 蒙古文
28 古閃文
29 斯拉夫文
30 越南文
31 信德文
32 未定義

應將該條 platformID 為 1 的名稱紀錄的 platEncID 設定為該紀錄對應的代號。

platformID 為 3 時,platEncID 可以有如下定義的值

0 符號字體
1 Unicode 基本文平面 (UCS-2)
2 ShiftJIS
3 PRC
4 Big5
5 Wansung
6 Johab
7–9 未定義
10 Unicode UCS-4
這裡一般選擇 1。

▍語言識別符

用以標註這條名稱紀錄的語言。

platformID 為 0 時,似乎沒有 langID。

platformID 為 1 時

0x0 英文
0xb 日文
0x13 繁體中文
0x21 簡體中文

限於篇幅,不能講所有語言全部列出,這裡列舉一些常見的。

詳細資訊請造訪 name - Naming table specification - Typography。連結中的值是十進制,也沒有添加「0x」的前綴,需要手動轉換。

platformID 為 3 時,常見的有

0x404 繁體中文(台灣)
0x804 簡體中文(大陸)
0xC04 繁體中文(香港)
0x409 英文(美國)
0x809 英文(英國)
0x411 日文

詳細資訊請造訪 name - Naming table specification - Typography

▍名稱識別符

用以標記這條紀錄的內容是字型的家族、子族、版權等。nameID 可以為 0 到 327670。一般的字型檔只包括 nameID 為 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 16, 17。

0 到 25 的 nameID 已經被預定義,分別為

0 版權信息
1 家族名
2 子族名(樣式名)
3 唯一標識符
4 全名(包括家族名和子族名)
5 版本號
6 PostScript 名稱(PS 名稱)。ttx 中只能為不得包含 [](){}<>% 9 的不超過 63 個的 ASCII 字串
7 商標說明
8 製造商名
9 設計者姓名
10 字體描述,可以包括修訂信息、使用建議和特性等
11 字型供應商 URL
12 字型設計者 URL
13 許可描述
14 許可證資訊 URL
15 保留(未定義)
16 首選家族名
17 首選子族名
18 相容性全名(僅用於 macOS,非必須)
19 示例文本
20 PostScript CID findfont 名稱
21 WWS 家族名
22 WWS 子族名
23 淺色調色板
24 深色調色板
25 可變字型的首位名稱紀錄 nameID
26 到 255 為以後 OpenType 標準保留
256 到 2767 用於描述可變字型子樣式名、OpenType 特性,如樣式集名稱

▍macOS 和 Windows 下的 'name' 表的區別

參見 Windows 在安装字体时是如何识别字体和字族的?

macOS 標準

nameID 為 1 和 2 的內容分別為意識上的家族名和子族名,例如有個字體叫 SampleFont Condensed Semibold Italic,它的這兩個應該為

家族名:SampleFont Condensed
子族名:Semibold Italic

或者

家族名:SampleFont
子族名:Condensed Semibold Italic

更推薦前者。macOS 的標準下,可以沒有 platformID 為 1 的首選家族名和首選子族名。

Windows 標準

1. 如果它的子族為四大基本樣式(標準、斜體、粗體、粗斜體),nameID 為 1 和 2 的內容也為意識上的家族名和子族名,並且不需要首選家族名和首選子族名。

對於其他的子族,例如 SampleFont Condensed Semibold Italic,它的這兩個應該為

家族名:SampleFont Condensed Semibold
子族名:Italic

2. 如果字族相同,Windows 最多只能識別子族名為 Regular, Italic, Bold, Bold Italic 的四個字型檔。另一種寫法可以是

家族名:SampleFont Condensed Semibold
子族名:Condensed Semibold Italic

但並不推薦。若要能在「控制台」的「字型」中正確歸為字族,則應添加首選家族名和首選子族名,這兩者的寫法同 macOS 的家族名和子族名。

▍結尾

本人對此有所興趣,寫這篇文章只是為相同的愛好者提供一個入門級的指導。本文有所紕漏,仍望各位讀者大膽指出。感謝。

编辑于 2019-10-29

文章被以下专栏收录