为一个字符正常显示我遍历了macOS系统的所有字体ttf(含代码)

本文原文:为一个字符正常显示我遍历了macOS系统的所有字体ttf(含代码)

近期再做一个简体繁体转换APP,然而发现有些字体无法显示,具体情况如下:

简体繁体转换古字查guzicha

为了解决这个问题,我在编写python程序时也遇到过,解决方法非常简单找个大点的字库就可以。然而这一次却没有成功,找了好几个超大字库都无法正常显示。无法显示汉字情况如下:

字符:
UniCode编码:U+e816


guzicha.com

虽然app无法正常显示,但是我电脑和xcode都可以显示正常,如下图:

上面情况困扰我2天了,后来突然想到。既然macOS系统可以显示,那么肯定证明macOS系统已经正常安装了可以使用的字体。于是一个疯狂的想法浮现在我脑海,也许3步就可以找到自己需要的字体

    1. 找到所有macOS所有字体文件
    1. 挨个比对包含e816编码ttf文件
    1. 在app里面试用,看看能否正常显示

想法有了,我们就开始放手做了。第一步查找所有ttf文件,这个非常简单,用find命令就搞定了

sudo find  / -name  "*.ttf"

上一个命令,我就找到了2948个文件,如下图:


guzicha.com

第二步,写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个文件符合需求


guzicha.com

我随便找个了个fangsong.ttf,一测试就成功了。通过输出结果才发现,原来花园字体和全宋体没有成功,主要是unicode编码前面有的是u2,uni2造成的。

最终效果

往期精彩

  • 请点击,免费订阅《学Swift挣美元》专栏

  • 赚钱App研究之生成代码app

  • 赚钱App研究之格式转换类app

  • reportlab教程和源码大全

  • python源码大全

  • Sqlite教程和SQL语句请关注我的专栏

你可能感兴趣的:(为一个字符正常显示我遍历了macOS系统的所有字体ttf(含代码))