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

本文原文:为一个字符正常显示我遍历了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

往期精彩

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,717评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,501评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,311评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,417评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,500评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,538评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,557评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,310评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,759评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,065评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,233评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,909评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,548评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,172评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,420评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,103评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,098评论 2 352

推荐阅读更多精彩内容

  • 字符集和编码简介 在编程中常常可以见到各种字符集和编码,包括ASCII,MBCS,Unicode等字符集。确切的说...
    兰山小亭阅读 8,480评论 0 13
  • 1 概述 最近项目中要添加表情包聊天的功能(文本和表情包要混合在一起),最直接的解决方案应该就是图文混排,对于这个...
    小芸论阅读 8,465评论 0 3
  • 去年十月份改论文时,用matplotlib做图,生成pdf,插入到word文档中。但是需要把整个字体都嵌入到pdf...
    figs阅读 7,109评论 0 5
  • 我每天熬夜有的时候会很想睡,这个时候就会逼迫自己不睡觉,一些时候我在看书一些时候我在打游戏,看书当然是大多数时间。...
    真抱歉我是个俗人阅读 95评论 0 1
  • 极端: 1)事物发展所达顶点。2)达到极点的。3)事物发展的端点状态,两个最高峰,两个互为对立的方面。4) 非常。...
    杜兜兜兜兜阅读 209评论 2 3