本文原文:为一个字符正常显示我遍历了macOS系统的所有字体ttf(含代码)
近期再做一个简体繁体转换APP,然而发现有些字体无法显示,具体情况如下:
为了解决这个问题,我在编写python程序时也遇到过,解决方法非常简单找个大点的字库就可以。然而这一次却没有成功,找了好几个超大字库都无法正常显示。无法显示汉字情况如下:
字符:
UniCode编码:U+e816
虽然app无法正常显示,但是我电脑和xcode都可以显示正常,如下图:
上面情况困扰我2天了,后来突然想到。既然macOS系统可以显示,那么肯定证明macOS系统已经正常安装了可以使用的字体。于是一个疯狂的想法浮现在我脑海,也许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
运行结果
一共有个75个文件符合需求
我随便找个了个fangsong.ttf,一测试就成功了。通过输出结果才发现,原来花园字体和全宋体没有成功,主要是unicode编码前面有的是u2,uni2造成的。
最终效果
往期精彩
请点击,免费订阅《学Swift挣美元》专栏
赚钱App研究之生成代码app
赚钱App研究之格式转换类app
reportlab教程和源码大全
python源码大全
Sqlite教程和SQL语句请关注我的专栏