TTF 轉 WOFF2 工具

除了 FontForge 之外,目前市場上有許多更現代且易於使用的 TTF 轉 WOFF2 工具,分別適合網頁開發者、設計師或是有大量轉換需求的工程師。

線上轉換工具

如果你不想安裝軟體,且轉換數量不多,這幾個網站是首選。

  • Fontsource Webfont Converter純瀏覽器處理,檔案不會上傳到伺服器,對隱私更有保障,速度也非常快。
  • Transfonter這是目前開發者最推薦的工具。它除了轉換格式,還能幫你生成 @font-face 的 CSS 代碼,並支援字體子集化(Subsetting)來縮減檔案體積。
  • CloudConvert萬用型的檔案轉換器,如果你的字體檔案非常大(超過 10MB),一般的網頁工具可能會失敗,這時可以用 CloudConvert 處理。

命令列工具 (CLI)

如果你需要批次處理,或是想把轉換流程加入自動化腳本,這幾個工具非常強大。

  • google/woff2這是 Google 官方釋出的參考代碼。在 macOS 可以直接用 brew install woff2 安裝,之後在終端機輸入
    woff2_compress yourfont.ttf
    就能得到 WOFF2 檔。
  • fonttools (Python)這是字體工程領域的標準工具。安裝 Python 後執行
    pip install fonttools
    轉換指令:
    pyftsubset yourfont.ttf “*” –flavor=woff2 –output-file=yourfont.woff2
  • wawoff2 (Node.js)這是 Google woff2 的 WebAssembly 版本,適合 Node.js 環境。執行
    npx wawoff2 compress yourfont.ttf

工具對比總結

工具類型推薦名稱優點缺點
線上網頁Transfonter功能最全,可生成 CSS有檔案大小限制
線上網頁Fontsource本地瀏覽器運算,隱私好功能較單一
命令列 (C++)woff2 (Google)速度最快,官方標準需手動編譯或安裝環境
命令列 (Python)fonttools功能最強大,支援子集化學習曲線較高

如果你只需要簡單轉檔給網站用,我建議直接用 Transfonter。如果你是想研究如何縮小字體體積,那麼 fonttools 是比較專業的選擇。


使用 Python 進行自動化轉換

如果你的電腦有安裝 Python,使用 fonttools 是最專業的做法。它不只能轉檔,還能移除字體中用不到的字元來減肥。

首先安裝必要的套件:

pip install fonttools brotli

接著你可以使用這段簡單的腳本,它會掃描資料夾內所有的 TTF 檔案並轉換成 WOFF2:

import os
from fontTools.ttLib import TTFont

def convert_to_woff2():
    for file in os.listdir('.'):
        if file.endswith('.ttf'):
            font = TTFont(file)
            output_name = file.replace('.ttf', '.woff2')
            font.save(output_name, reorderTables=True)
            print(f'已完成: {output_name}')

if __name__ == '__main__':
    convert_to_woff2()

使用 Shell 指令批次轉換

如果你在 macOS 或 Linux 環境,且已經安裝 Google 官方的 woff2 工具,可以用一行指令處理整個資料夾。

安裝方式:

brew install woff2

轉換指令:

for f in *.ttf; do woff2_compress "$f"; done

這會直接在同個資料夾產生對應的 WOFF2 檔案。這個工具的壓縮率通常是最好的,因為它使用了 Google 開發的 Brotli 壓縮演算法。


pyftsubset 是 fonttools 套件中最強大的工具。它的核心邏輯是從原始字體中「切出」你需要的部分,並重新打包成網頁專用的格式。

基礎轉換指令

如果你不需要刪除任何字元,只是單純想把 TTF 轉成 WOFF2,可以使用這個指令。

Bash

pyftsubset input.ttf --glyphs="*" --flavor=woff2 --output-file=output.woff2
  • --glyphs="*":代表保留原字體中所有的字元,不進行刪減。
  • --flavor=woff2:指定輸出格式為 WOFF2。如果不加這行,預設會輸出 TTF。

字體子集化(縮減體積)

中文字體動輒 10MB 以上,載入速度很慢。子集化可以讓你只保留網頁會用到的字。

  • 指定文字內容:如果你只想保留特定的字(例如「你好」),可以使用 –text。Bashpyftsubset input.ttf --text="你好" --flavor=woff2
  • 使用 Unicode 範圍:如果你想保留常用的中文字範圍,可以使用 –unicodes。Bashpyftsubset input.ttf --unicodes="U+4E00-9FFF" --flavor=woff2

常用的進階參數

為了讓網頁載入更順暢,建議加上以下參數優化字體結構。

  • –layout-features=”*”預設情況下,子集化會刪除 OpenType 特性(如連字、垂直排版)。如果你需要保留這些功能,務必加上這個參數。
  • –no-hinting如果你不在意舊螢幕的清晰度,移除 Hinting 資訊可以再減少約 10% 到 20% 的檔案大小。
  • –desubroutinize針對 CJK(中日韓)字體,這可以解決某些瀏覽器在渲染子集化後的 CJK 字體時出現的異常。

完整的專業指令推薦

這是我最常建議的「高效能網頁字體」轉換公式:

pyftsubset MarukoGothic.ttf --unicodes="U+4E00-9FFF,U+0000-007F" --flavor=woff2 --layout-features="*" --output-file=font.woff2

這個指令會保留「基本拉丁字母」與「常用中文字範圍」,並維持所有的字體排版特性。


針對你的需求,要把日文、英文以及常用標點符號都包進去,你需要組合多個 Unicode 區塊。

推薦的 Unicode 範圍組合

你可以將以下這段字串直接複製到 --unicodes 參數後。這包含了基本英文、常用符號、日文(平假名、片假名、漢字)以及中文字:

U+0000-007F,U+00A0-00FF,U+2000-206F,U+3000-303F,U+3040-309F,U+30A0-30FF,U+4E00-9FFF,U+FF00-FFEF

各區塊詳細說明

下表拆解了這串代碼代表的意義,你可以根據需求增減:

範圍 (Unicode Range)內容說明包含項目
U+0000-007F基本拉丁字母數字、大小寫英文字母、基礎半形標點
U+00A0-00FF拉丁增補西歐語言常用符號、貨幣符號
U+2000-206F一般標點特殊引號、破折號、點號
U+3000-303FCJK 符號全形空格、句號、括號、頓號
U+3040-309F平假名日文平假名、濁音符號
U+30A0-30FF片假名日文片假名、長音符號
U+4E00-9FFFCJK 漢字常用繁體、簡體、日文漢字
U+FF00-FFEF半形/全形形式全形英文字母、全形數字、常用符號

最終執行指令範例

這是一個非常完整的轉換指令,適合處理像「丸子黑體」這類包含中日文的字體:

for macOS / Linux:

pyftsubset MarukoGothic.ttf \
--unicodes="U+0000-007F,U+00A0-00FF,U+2000-206F,U+3000-303F,U+3040-309F,U+30A0-30FF,U+4E00-9FFF,U+FF00-FFEF" \
--flavor=woff2 \
--layout-features="*" \
--output-file=MarukoGothic_optimized.woff2

for Windows:

pyftsubset MarukoGothic.ttf ^
--unicodes="U+0000-007F,U+00A0-00FF,U+2000-206F,U+3000-303F,U+3040-309F,U+30A0-30FF,U+4E00-9FFF,U+FF00-FFEF" ^
--flavor=woff2 ^
--layout-features="*" ^
--output-file=MarukoGothic_optimized.woff2

小提醒

如果你發現某些特殊的避頭尾點號(如雙引號)沒出現,通常是因為它們落在 U+2018-201D 之間,上面的 U+2000-206F 已經完整覆蓋了。