Windows 7 中的 SimSun-ExtB 是什麼字體,為何與中易宋體 SimSun 顯示出來不一樣?

在 IE9 中會看到如下效果:

而 Firefox、Chrome、Opera 里顯示出來都是宋體:

在 IE9 的默認設置裡面可以看到:


SimSun-ExtB 從 Vista 開始就存在了, 它與 SimSun 可視為同一套字體的兩部分, 不太嚴格的講, 類似於「中易宋體 (下)」與「中易宋體 (上)」. 這是由於 SimSun 作為 Windows 中最基本的簡體中文顯示字體, 其需要包含的字形數量相當多, 而現行字體格式單個文件不能容納超過 65535 個字形, 因此按照 Unicode 區段進行劃分, 將全部字形分為兩組編入兩個字體文件中. 與之類似的, 細明體 (MingLiU) 作為最基本的繁體中文顯示字體, 也被分為兩個字體文件.

為使這兩個 (或更多個) 字體文件可以協同工作, Windows 通過 FontLink 將它們關聯在一起. 因漢字的常用程度, 國家標準, 技術問題等多方面影響, 我們一般情況下接觸到的絕大部分漢字都包含在 SimSun 中, 而非 SimSun-ExtB. 如果指定用後者顯示 "常用漢字", 與指定用西文字體顯示它們無異, 因為字體中都並不包含這些字形.

當字體遇到不包含的文字時, 系統或軟體會調用相應的 Fallback 規則 - 簡單地說就是有一份字體列表, 用其中的字體依次去嘗試能否顯示那個 "缺字", 直至成功或全部失敗 - 所以當指定用 SimSun-ExtB 顯示 "常用漢字" 時, 理應是無法顯示的, 但系統 Fallback 到了能顯示它們的字體, 一般情況下也就是 SimSun, 這也就是為什麼很多人以為 SimSun 與 SimSun-ExtB 是完全一樣的.

而圖中 IE 與其它瀏覽器顯示的不一致, 說明在 IE 的設定中, 上述的 "一般情況下" 的那個字體不是 SimSun 而是其它字體. 造成這個問題的原因就比較複雜了, 似乎 @梁海 以前研究過.


我找到了一些答案與各位分享:

Windows 中 Font Fallback 和 Font Linking 有兩種機制匹配字體,通常情況下:

  • Font Fallback 是在應用程序中完成(比如瀏覽器);
  • Font Linking 是在操作系統的 GDI 中完成 。

當並列存在瀏覽器的 Font Fallback 和 操作系統的 Font Linking 的時候, Font Linking 會覆蓋掉 Font Fallback 的結果,也就是最終生效的是 Font Linking 。

下面結合實例分別闡述兩種機制的處理過程:

  1. Font Fallback

    為每種語言提供默認字體

    比如Notepad上要顯示一段文本,包括了英語、希伯來語和Telugu語,用戶選用Tahoma來顯示它。Tahoma是Opentype字體,支持英語和希伯來語的顯示,但不支持Telugu語,所以當解析到Telugu字元時,Uniscribe發現Tahoma無法顯示字元,便使用Telugu的默認字體Gautami來顯示它。這些默認的字體,用戶無法增加或修改。整個過程對用戶來講是透明的,不需要用戶去關心其中。
  2. Font Linking

    Font Linking 技術能夠使用一種甚至多種字體(linked font)鏈接到另外一種字體(base font)。你如果使用 Base Font 去顯示某一段多語言的文本,對於不支持 Base Font 的文字,系統能夠自動使用 Linked Font 代替。

    這個關係可以到註冊表中看到( 在 HKEY_LOCAL_MACHINE–SOFTWAREMicrosoftWindows NTCurrentVersionFontLinkSystemLink )

    所以我們看看 SimSun-ExtB 對應的情況是:

    micross.ttf 是對應的字體文件名,後面的 108,122 則代表字體名稱。當 IE9 默認設置 SimSun-ExtB 這個字體時,結合 @厲向晨 的答案,我們發現 SimSun-ExtB 中包含的是生僻字,測試例子中是常用字,所以系統會繼續 Font linking 到 micross.ttf 這個字體上,那麼最終實際顯示出來的也就是這個字體了。
  3. Font Substitution

    將一種字體的請求轉化到另一種字體的機制。參見註冊表HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionFontSubstitutes

    這裡我們就可以解釋如果 Windows 安裝了 Helvetica 字體為什麼顯示為 arial 字體了

  4. 小結

    GBK 編碼的 html 文檔 在 IE9 中 如果 字體定義為: font-family:tahoma, sans-serif; 則會 顯示為 micross 字體;UTF-8 編碼 不會有這個問題。
  5. 終於找到這個字體是神馬了!是 Adobe 黑體 Std,具體原因目前大致了解了,有待測試證實。

IE9 標準模式下

  • font-family: sans-serif; 顯示為 adobe 黑體

  • font-family: serif; 顯示為 adobe 仿宋

前提是安裝了以上兩個字體,photoshop 一般會自帶這兩個字體。


因為SFNT結構字體上限的緣故,只能用另外的字體顯示Unicode CJK擴展B區的字體


推薦閱讀:

哪些字體和設計方案最適合用在名片上?
怎樣提高網頁圖片中的字體渲染質量?
知乎 Logo 的字體是什麼?是否經過變換處理?
阿芙精油為什麼要買斷康熙字典體?
如何評價華康少女體?

TAG:字體 | 字體設計 | CSS | 字體排印 | 中文排版 |