Windows 在安裝字體時是如何識別字體和字族的?

問題源於在windows環境中安裝Sanfrancisco字體(經Mac系統拷貝和Fontcreator轉換)時,偶然發現fonts文件夾下顯示的字體數目和實際安裝的字體數目不一致:SFCompactText字族缺少Regular字重,SFUIText字族缺少Regular和SemiboldItalic字重。一開始懷疑漏裝了,於是將SFCompactText12個字重文件一個個安裝,但是都顯示已安裝過是否替換,因此排除漏裝問題。最後經過比對發現SFCompactTextRegular和SFCompactTextItalic,SFUITextRegular和SFUITextItalic,SFUITextSemibold和SFUISemiboldItalic縮略圖相同,雙擊預覽時的標題欄相同,但各自的預覽顯示都是正確的(如圖)。

於是懷疑是否是字體屬性問題,用Fontcreator打開字體文件後,發現屬性並沒有異樣(如圖)。

於是懷疑是否是兩個字體屬性相同導致Windows無法區別,於是在Italic中勾選斜體再次輸出,此時發現確實兩個字體縮略圖和顯示名稱不同了,但是卻正好反了過來(如圖)。

於是在Fontcreator當中對Regular勾選斜體,對Italic不勾選斜體,再次輸出,此時兩個都顯示正確了(如圖)。

於是進行安裝,此時發現在Fonts文件夾中名稱卻顯示不正確(如圖),兩者都顯示為斜體。

通過以上方法在更改SemiboldItalic時沒有成功,於是懷疑windows識別字體的根據是寬度、粗細度、粗體、斜體選項這幾個因素(如圖)。

於是將SF-Compact-Text字族12個字重全部在Fontcreator中重新設置,確保每一個字體的屬性不重複,最後所有SF字體全部安裝成功。唯二遺留的問題就是在Fonts文件夾中的名稱顯示問題(如圖)和PS字體列表中不顯示SFUITextSemiboldItalic。

經過此次事件開始懷疑以前安裝的字族文件是否都有缺少,結果發現果然如此,Helvetic安裝文件和實際Fonts中顯示不一致(如圖)。

因此求專業人士告知windows安裝字體是怎麼識別字體和字族的,以及是什麼造成了這些問題且該如何解決:

· 安裝文件和Fonts顯示文件數目名稱不一致。

· PS字體列表和Fonts文件夾字體列表不一致。


—— 2017/4/20 ————

Windows 對於字體信息要求更嚴格,涉及到 name, OS/2, head 表,只要一個出差錯都會導致顯示不正常。

name 表

最關鍵的的部分。主要的值有 Family, Subfamily, Full Name, Preferred Family, Preferred Subfamily 等。

Windows 下最標準的字體應當只有 Regular, Italic, Bold 和 Bold Italic。對於這種情況 Family 和 Subfamily 就足夠用,前者填入字族名稱,後者填入上述四種樣式(Windows 也僅完全 [2017/4/22] 支持它被填入此四,否則會不正常 [2017/4/22] ,而不是不可以 [2017/4/22])。

後來由於需求增大,所需字重越來越多,Preferred Family 和 Preferred Subfamily 的用途就體現出了。當其存在時,優先以此進行歸類。而 Preferred Subfamily 的命名雖也嚴格,但至少能夠滿足多字重了。參見 怎麼給系統字體歸類? 的首票回答。

下面舉兩個例子,這樣的命名 Windows 是支持的、能被歸為一個字族的:

SampleFont Regular

Family: SampleFont
Subfamily: Regular
Full Name: SampleFont

SampleFont Semibold Italic

Family: SampleFont Semibold
Subfamily: Italic
Full Name: SampleFont Semibold Italic
Preferred Family: SampleFont
Preferred Subfamily: Semibold Italic

OS/2 和 head 表

它們中的 fsSelection value 和 macStyle value 分別用作指定這個字體的樣式鏈接和標記這個字體的樣式。如果不用 AFDKO 中的 ttx 或 otfcc,一般的字體編輯程序中只要你在改打勾的地方打勾,該選擇的地方選擇正確,都是不需要操心這兩個表的。

SF 的問題

首先它沒有 Preferred Family 和 Preferred Subfamily,而將其直接寫在 Family 和 Subfamily 中,Win32 程序字體選擇會出錯。

其次它的 fsSelection value 和 macStyle value 都沒有怎麼填寫,字體調用會出錯。

然而 SF 本來就是 Apple 的私有字體,只用保證在 macOS 上的兼容性就好了啊。

—— 2017/4/22 ————

Windows 和 macOS 的字體調用方式本來就不一致。

簡單來說,Windows 嚴格依照字體內部信息調用,Win32 程序的 UI 通常只需要兩種字重、正體和斜體,並依靠 name 表中 Family 相同的多個字體的 macStyle value 識別、fsSelection value 鏈接。於是你就可以輕輕鬆鬆地使用加粗 (B)和傾斜按鈕 (I) 輕鬆切換樣式了。Windows 根本還是考慮實用性的,Regular, Italic, Bold 和 Bold Italic 這四個樣式能滿足用戶最基本的要求,表示強調、引用等,一般情況下,何必像 macOS 那樣(例如 Pages),一個字族,下面那麼多字重,一般用戶怎麼選擇的過來,需要用到這麼多字重的還會用 Pages 嗎?

Windows 適用字體的 macStyle value 和 fsSelection value 都好好地填寫,反觀某家公司,清一色的

&
&

是誰不按標準呢?

思源黑體也曾有過類似的問題,但之後在思源宋體中更正過來了,這也是一種態度的表現吧。

忽略版權的情況下修改 SF 字體

這裡用四個字體來舉例子:SF Compact Text Regular, Italic, Bold, Light Italic,提取自 macOS。

  • name 表的修改

這是四個字體的 name 表節選:

SF Compact Text Regular

Family: .SF Compact Text
Subfamily: Regular
Full Name: .SF Compact Text Regular

SF Compact Text Italic

Family: .SF Compact Text
Subfamily: Italic
Full Name: .SF Compact Text Italic

SF Compact Text Bold

Family: .SF Compact Text
Subfamily: Bold
Full Name: .SF Compact Text Bold

SF Compact Text Light Italic

Family: .SF Compact Text
Subfamily: Light Italic
Full Name: .SF Compact Text Italic

我們需要將其修改為(可以使用 ttx, otfcc 和 ttfname 以及各類字體編輯程序)

SF Compact Text Regular

Family: SF Compact Text
Subfamily: Regular
Full Name: SF Compact Text Regular
// 或添加:
Preferred Family: SF Compact Text
Preferred Subfamily: Regular

SF Compact Text Italic

Family: SF Compact Text
Subfamily: Italic
Full Name: SF Compact Text Italic
// 或添加:
Preferred Family: SF Compact Text
Preferred Subfamily: Italic

SF Compact Text Bold

Family: SF Compact Text
Subfamily: Bold
Full Name: SF Compact Text Bold
// 或添加:
Preferred Family: SF Compact Text
Preferred Subfamily: Bold

SF Compact Text Light Italic

Family: SF Compact Text Light
Subfamily: Italic // 或 Light Italic
Full Name: SF Compact Text Light Italic
Preferred Family: SF Compact Text
Preferred Subfamily: Light Italic

Regular 的 Full Name 末尾可以選擇添加 Regular,不影響。

請注意,非常規或粗體的字重,一定要在 Family 後添加字重名,否則會導致許多程序多字重的隱藏,例如 Word,發現字體列表中該字體只有一種字重;Subfamily 只要 Family 和常規或粗體的字重的 Family 不一樣可以再次添加字重信息;必須添加 Preferred Family 和 Preferred Subfamily。

  • OS/2 和 head 表

1. 如果你使用的是 FontCreator、FontLab Studio 和 FontForge 等,只需要在涉及粗體、斜體的複選框上正確地打勾即可。

2. 如果你使用 ttx(otfcc 暫時沒嘗試),執行

ttx -t OS/2 -t head &

(& 指文件路徑)提取單一字體文件的這兩個表,得到一個 .ttx 文件。找到

&
&
&
&
&
&
&
&
&

對於分別的 .ttx 文件,若該字體為 Regular, Bold 或 Italic,則將上述對應位置的值改為 1,若不是則改為 0。由此可見,Apple 將 SF 所有的字體都標註為 Regular 了。對每一個字體提取、修改完畢後,執行

ttx -m & &<.ttxFilePath&>

(& &<.ttxFilePath&> 分別指字體文件路徑、.ttx 文件路徑),得到文件名以原字體文件的加 #1 結尾的字體文件,即為所需修改好的字體文件。

最後,破乎的編輯器真難用。


看 OT Spec……

牽涉到 head.macStyleOS/2.fsSelection 以及 name table,這幾個數據差一點就無法安裝或者正確識別。


(有更新)

我插句嘴,其實從這個問題上就能看出來兩家公司是如何思考問題的。Subfamily 從今天來看雖然是歷史遺留問題,但它作為一個發布了幾十年並且已經貫徹到幾乎所有第三方軟體里的標準,就算設計理念過時(只有那 4 個值能用),也不是隨便能改的。微軟在這個問題上就是一種負責任的做法:只要成了標準,再爛也得兼容它。Win 10 也一樣,保留以前所有的 public API,這是一種負責任的表現。Java 的 PriorityQueue 的風格和其他數據結構格格不入,被碼農罵成了狗,但 Oracle 敢改嗎?不敢。標準一旦成為標準就很難改了。反觀蘋果,對標準二字看不到一丁點尊重。自家充電插頭年年改,改得消費者苦不堪言就不提了,這屬於內政。但在軟體上呢?Swift 每過一段時間所有 public API 甚至語法就要大改一通,改完之後以前的程序統統過不了編譯,你這讓哪家公司敢把自己的大型項目寄托在 Swift 上?還號稱強大到「能寫操作系統」,真是笑話。在字體問題上,這家公司放著 Preferred Subfamily 不用,對 Subfamily 亂寫一氣,肆意踐踏標準,真把工業標準當充電插頭啦?反倒是自家內部的 private API,譬如 iTunes 的 Coverflow,這麼多年一字未改,非常耐人尋味。

其他答案引用了兩家公司最新的字體 Spec 來反駁我。蘋果發布的標準朝令夕改,暫且不談;而且蘋果那玩意不叫 OT Spec,叫它 Apple Spec 還差不多,照這個 Spec 做出來的字體除了蘋果其他平台一概不兼容。微軟的 OT Spec 這次改動很大,估計是在去年引入 Variable Font 的時候改的。現在裡面有關 Subfamily 和 Preferred Subfamily(現在叫 Typographic Subfamily)的描述變了,以前的描述是類似「由於歷史原因,Subfamily 只能填寫固定的值,與 style linking 對應」的話。但微軟在 Subfamily 這個問題上的立場沒有變化。我們先來看現在微軟對 Family 欄位的描述:

Font Family name. Up to four fonts can share the Font Family name, forming a font style linking group (regular, italic, bold, bold italic — as defined by OS/2.fsSelection bit settings).

這是什麼意思?這表明該欄位是專門用於那四個值的。要知道 Family 欄位和 Subfamily 是綁在一起的,Family 有這個限制,Subfamily 就沒有這個限制了?我們跳過微軟對 Subfamily 看似自相矛盾的描述(This is assumed to address style (italic, oblique) and weight (light, bold, black, etc.).),接著往後看:

A font with no particular differences in weight or style (e.g. medium weight, not italic and fsSelection bit 6 set) should have the string 「Regular」 stored in this position.

這裡說明,諸如「medium」這樣的子族,其 Subfamily 應該填寫 Regular。因此微軟的態度是明確的:Family 和 Subfamily 欄位仍應保持以前的用法。Spec 在最後列舉了幾個字族命名的例子(這幾個字族是 Adobe 發行的),我們可以很清楚地看到 Subfamily 應該怎麼填:

Minion Pro Semibold:

Name ID 1: Minion Pro SmBd

Name ID 2 (Subfamily): Regular

Name ID 16: Minion Pro

Name ID 17: Semibold

Subfamily 就是這麼回事。

另外有關於微軟和蘋果的黑歷史,我不想多說。喬布斯含淚轉讓 TrueType 的時候 OT 還不存在,因此不能拿這件事說明微軟(和 Adobe)現在搞的東西不叫標準。其實這些東西沒什麼好爭論的,說到底就是誰佔領了市場誰說了算。佔領市場的那方,就慢慢成了標準。每個公司都希望用自己研發的標準壟斷市場,誰也不服誰。在 Windows 平台上,Office 對 Adobe 的字體支持奇爛無比,對蘋果的支持更不必說,字體連裝都裝不上;在 Mac 平台上,TrueType AAT 只被蘋果自己的 iWork 支持,Adobe 不支持,Mac 版 Office 也不支持。大佬們看似相處融洽,一會聯手一會合作,但仔細觀察就會發現,自己只玩自己的。


瀉藥。

在apple developer上下載了最新的Sanfrancisco 版本號12.0d8e1如下圖

並且安裝了所有字體文件包括用於 iOS、tvOS 和 macOS 的 SF Compat 以及用於 watchOS 的 SF UI,未出現任何衝突。

然後在Adobe illustrator中觀察發現列表中是15個字體,而文件夾中是21個文件。其中缺少了text部分的6個斜體。

嘛,這個是老生常談的問題了,macOS的字體和win的字體本身就兼容性差,從type1開始到現在otf能雙向兼容的確解決了不少問題,但是請注意:SF和蘋方等字體本身就是為Apple平台開發使用的,所以無需針對win進行【多餘的、無用的】優化,這裡的優化專指name表的問題。

造成這個問題的主要原因,是因為字體內部存在多種名稱信息。與題主發現的問題方向大致吻合,因為 Mac 和 Win 讀取了不同的值導致了這個問題。

這在目前沒有什麼解決方法,因為那是mac專用字體,不寫多餘的name表也是正常現象。

目前能想到的最簡單的解決方案是修改字體的&表,把字族拆開(與題主做的方法一致)。

BTW:在mac中,字體冊可以調用的功能和分類很多也更詳細,例如當你收藏字體的時候可以建立一個集,其中可以選擇的偏好有family name、style name、postscript name、kind、languages、design style等,mac中的命名的詳細程度導致了其字族family的結構複雜但是有序,而到win中則只簡單的讀取了family信息和第二層級的字重信息。

如果簡單點描述其實是這樣的:

來了一堆貨物,mac的分揀流程是這樣的

這樣的

以及這樣的

裝完字體後是這樣的

這樣的

而win的分揀是這樣的

和這樣的

裝完字體後是這樣的

圖侵刪。


微軟自家標準里Font Subfamily沒有限制只能那4個值:

Microsoft Typography

Font Subfamily name. The Font Subfamily name distiguishes the font in a group with the same Font Family name (name ID 1). This is assumed to address style (italic, oblique) and weight (light, bold, black, etc.).

倒是蘋果自家標準里明確說了Preferred Subfamily僅僅是Windows的地方標準:

Font Names Table

Preferred Family. In Windows, the Family name is displayed in the font menu, and the Subfamily name is presented as the Style name.

按歷史淵源來說,那也是蘋果家的Font Table Spec比較正統吧,畢竟微軟家的TrueType還是喬布斯免費授權給微軟的,怎麼有人就指著蘋果家說你不守標準,卻忽略了微軟自己糊了自己的標準一臉呢?

Subfamily 從今天來看雖然是歷史遺留問題,但它作為一個由蘋果創造,並且已經貫徹到幾乎所有第三方軟體里的標準,微軟雖然自己規定了任意表示風格與字重的值都能用(但是實踐里只有那 4 個值能用),我微軟的實現就是不遵守自己的標準,這是一種負責任的表現。

在字體問題上,這家公司(微軟)放著 Subfamily 不用,對 Preferred Subfamily 亂寫一氣,肆意創造地方標準,真把工業標準當充電插頭啦?

攤手,畢竟蘋果垃圾政治正確咯?


推薦閱讀:

請問這是是什麼字體?是什麼意思?
你見過最細的中文字體是什麼?
為什麼把搜狗輸入法字體設定為儷宋Pro後,會有一些字變成其它字體(如圖)?
「宋體」在小字體下不就沒襯線了,那還算有襯線體嗎?
為什麼除了Windows,其他系統的默認界面字體都使用黑體?黑體有什麼優勢?

TAG:字體 | 字體設計 | MicrosoftWindows | 字體鑒別 | Windows10 |