美文网首页学Swift挣美金python源码大全macOS Swift开发教程
为一个字符正常显示我遍历了macOS系统的所有字体ttf(含代码

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

作者: iCloudEnd | 来源:发表于2019-08-07 23:37 被阅读3次

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

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

    简体繁体转换古字查guzicha

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

    字符:
    UniCode编码:U+e816


    guzicha.com

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

    Jietu20190807-232417@2x.jpg

    上面情况困扰我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造成的。

    最终效果

    Jietu20190807-235243@2x.jpg

    往期精彩

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/qspzdctx.html