1. 程式人生 > >TTF字型檔案裁剪(支援簡體中文,繁體中文TTF字型裁剪)

TTF字型檔案裁剪(支援簡體中文,繁體中文TTF字型裁剪)

Google開源的字型提取神器——sfntly

sfnttool,官網地址是:https://code.google.com/p/sfntly/

可用於編輯、建立和使用字型檔案,主要針對OpenType,TrueType字型。
我在專案中,主要用於對漢字字型庫的裁剪(ttf字型檔一般都很大10M以上),提取專案需要的一個漢字子集(subset)。

環境準備:
首先安裝好Java環境,jdk 1.8.x以上,以及ant編譯工具;
然後下載原始碼https://github.com/googlei18n/sfntly;
編譯得到sfnttool.jar包。

裁剪字型庫以及注意事項:
1. 使用SfntToolGUI.jar或sfnttool.jar 提取指定字元子集(SfntToolGUI.jar是基於sfnttool.jar加了GUI介面)

java -jar sfnttool.jar -s '需要提取的字型' 源字型庫 匯出的最終字型庫
如:java -jar sfnttool.jar -s '01中國人' llk.ttf llk2.ttf

java -jar SfntToolGUI.jar
會有一個GUI介面可以操作(SfntToolGUI.jar是網上下載的),使用這個GUI工具點選確定生成完成後,需要關閉這個軟體,新生成的ttf檔案
才能預覽或使用FontCreator開啟,否則它會提示生成的ttf格式錯誤。

2. 需要注意的事項:
a. sfnttool 會根據當前系統使用的字符集編碼(GBK or BIG5等)把輸入的提取字串轉換成Unicode碼,然後再去ttf查到到對應的字,進而提取。

我第一次使用也是遇到一個坑:我使用的是簡體中文Windows系統(內碼表936(chcp命令可查詢當前系統使用的內碼表)),輸入GB2312編碼的簡體字串,
且輸入簡體中文黑體ttf字型,確實可以裁剪到自己設定的子集ttf字型。
   由於最近專案用到繁體中文,需要對繁體中文ttf進行裁剪,很直觀的想法就是輸入BIG5編碼的繁體字串和輸入一個繁體字型檔mingliu.ttf,
直接使用sfnttool提取子集,發現提取出來的並不是子集想要的。
   後來開始看sfnttool原始碼,發現sfnttool會根據當前系統使用的字符集編碼(我的系統使用GBK)把輸入的提取字串轉換成Unicode碼。也就是說我輸入的是BIG5
編碼的資料,而sfnttool把這些資料當做是GBK編碼的資料來轉成Unicode,這顯然是有問題的。
   一個最簡單的辦法把電腦系統的內碼表切換到950(BIG5),即切換到繁體版Windows,然後重新再使用這個工具。把BIG5編碼的字串輸入到sfnttool
   另外一個辦法就是修改下sfnttool原始碼可配置當前輸入的是什麼編碼的資料,以及正確的轉成對應的Unicode。

b. 還有些細節
mingliu.ttc, 細黑體_0.ttc, ttc可以使用FontCreator轉成mingliu_0.ttf, 細黑體_0.ttf

從 "mingliu_0.ttf" 提取字元子集,僅僅提取幾個字元就有4M多大小(源ttf有26M);

而提取常用漢字3000個左右,使用 "細黑體_0.ttf" 提取子集僅僅2.5M, 使用 "mingliu_0.ttf" 提取的子集有8.5M 。(估計是跟字型庫本身設定了什麼有關)

另外網上還有一個TTF字型裁剪小工具“TTF字型庫裁剪轉換工具”:

經過測試有部分字型不支援,也不支援繁體字型裁剪。

參考資料:
【工具】在TTF字型中提取想要的文字,讓字型檔案變迷你
https://blog.csdn.net/ldpjay/article/details/46561031

大坑已填,留個紀念:裁剪ttf,讓其大小更適用於移動裝置與網頁
https://blog.csdn.net/tianxiawuzhei/article/details/45720563

sfntly原始碼
https://github.com/googlei18n/sfntly
https://github.com/rillig/sfntly

谷歌開源的字型提取工具 sfntly 的正確開啟方式
https://www.skiy.net/201706064777.html

中文漢字 | ASCII | Unicode互相轉換工具 - aTool線上工具
http://www.atool.org/chinese2unicode.php