本文原文:為一個字符正常顯示我遍歷了macOS系統(tǒng)的所有字體ttf(含代碼)
近期再做一個簡體繁體轉(zhuǎn)換APP,然而發(fā)現(xiàn)有些字體無法顯示,具體情況如下:
為了解決這個問題,我在編寫python程序時也遇到過,解決方法非常簡單找個大點的字庫就可以茅姜。然而這一次卻沒有成功,找了好幾個超大字庫都無法正常顯示月匣。無法顯示漢字情況如下:
字符:
UniCode編碼:U+e816
雖然app無法正常顯示钻洒,但是我電腦和xcode都可以顯示正常,如下圖:
上面情況困擾我2天了锄开,后來突然想到素标。既然macOS系統(tǒng)可以顯示,那么肯定證明macOS系統(tǒng)已經(jīng)正常安裝了可以使用的字體萍悴。于是一個瘋狂的想法浮現(xiàn)在我腦海头遭,也許3步就可以找到自己需要的字體
- 找到所有macOS所有字體文件
- 挨個比對包含e816編碼ttf文件
- 在app里面試用,看看能否正常顯示
想法有了癣诱,我們就開始放手做了计维。第一步查找所有ttf文件,這個非常簡單撕予,用find命令就搞定了
sudo find / -name "*.ttf"
上一個命令鲫惶,我就找到了2948個文件,如下圖:
第二步实抡,寫python代碼逐個比對
from __future__ import print_function, division, absolute_import
from fontTools.ttLib import TTFont as t1
from fontTools.pens.basePen import BasePen
from reportlab.graphics.shapes import Path
import json
import os
import os.path
'''
查找包含 e816
from lookup_mac import *
s_str='e816'
txtPath='/Users/cf/Documents/所有ttf文件.txt'
oklist,errorlist=op_txt(txtPath,s_str)
oklist
'''
'''
-1 不是ttf
-2 沒有找到
-3 路徑不對
-4 可能不是ttf欠母,人工跳過
'''
import os
def op_txt(txtPath,s_str):
oklist=[]
errorlist=[]
for line in open(txtPath):
print(line)
filePath=line.replace('\n','')
filePath=filePath.replace('\r','')
if not os.path.isfile(filePath) :
errorlist.append((-3,filePath,'','can not find file'))
continue
if '/Users/cf/Library/Containers/com.apple.BKAgentService/Data/Documents/iBooks/' in filePath:
errorlist.append((-4,filePath,'','can not find file'))
continue
ret,p1,p2,p3=op_onefile(filePath,s_str)
if ret ==1:
print('ok=====:',ret,p1,p2,p3)
oklist.append((ret,p1,p2,p3))
continue
if ret ==-1:
errorlist.append((ret,p1,p2,p3))
return oklist,errorlist
def op_onefile(filePath,s_str):
#check is ttf
ret,p1,p2=check_ttf(filePath)
if ret <0:return ret,p1,p2,filePath
fileName=p1
font = t1(filePath)
glyphNames = font.getGlyphNames()
sIndex=0
for fname in glyphNames:
fname_low=fname.lower()
if s_str in fname_low:
return 1,sIndex,fname,filePath
sIndex=sIndex+1
return -2,'','not found',filePath
def check_ttf(filePath):
fileName=filePath.split('/')[-1].lower()
if ".ttf" not in fileName:
return -1,filePath,'not ttf'
return 1,fileName,'ok'
運行測試:
from lookup_mac import *
s_str='e816'
txtPath='/Users/cf/Documents/所有ttf文件.txt'
oklist,errorlist=op_txt(txtPath,s_str)
oklist
運行結(jié)果
一共有個75個文件符合需求
我隨便找個了個fangsong.ttf,一測試就成功了澜术。通過輸出結(jié)果才發(fā)現(xiàn)艺蝴,原來花園字體和全宋體沒有成功,主要是unicode編碼前面有的是u2,uni2造成的鸟废。