原文入口:

TTF字体文件裁剪(支持简体中文,繁体中文TTF字体裁剪)

对于TrueType(TTF)字体格式的介绍可以看:

https://www.cnblogs.com/slysky/p/11315735.html 

提到的文章。

Google开源的字体提取神器——sfntly

sfnttool,官网地址是:https://code.google.com/p/sfntly/

可用于编辑、创建和使用字体文件,主要针对OpenType,TrueType字体。

我在项目中,主要用于对汉字字体库的裁剪(ttf字库一般都很大10M以上),提取项目需要的一个汉字子集(subset)。

环境准备:

  • 首先、安装好Java环境,jdk 1.8.x以上,以及ant编译工具;
  • 然后、下载源码https://github.com/googlei18n/sfntly;
  • 最后、编译得到sfnttool.jar包。

裁剪字体库以及注意事项:

1、使用SfntToolGUI.jar或sfnttool.jar 提取指定字符子集(SfntToolGUI.jar是基于sfnttool.jar加了GUI界面)

java -jar sfnttool.jar -s '需要提取的字体' 源字体库 导出的最终字体库

  如:java -jar sfnttool.jar -s '01中国人' llk.ttf llk2.ttf

  java -jar SfntToolGUI.jar

  会有一个GUI界面可以操作(SfntToolGUI.jar是网上下载的),使用这个GUI工具点击确定生成完成后,需要关闭这个软件,新生成的ttf文件

才能预览或使用FontCreator打开,否则它会提示生成的ttf格式错误。

2、 需要注意的事项:

a、 sfnttool 会根据当前系统使用的字符集编码(GBK or BIG5等)把输入的提取字符串转换成Unicode码,然后再去ttf查到到对应的字,进而提取。

  我第一次使用也是遇到一个坑:我使用的是简体中文Windows系统(代码页936(chcp命令可查询当前系统使用的代码页)),输入GB2312编码的简体字符串,且输入简体中文黑体ttf字体,确实可以裁剪到自己设定的子集ttf字体。

  由于最近项目用到繁体中文,需要对繁体中文ttf进行裁剪,很直观的想法就是输入BIG5编码的繁体字符串和输入一个繁体字库mingliu.ttf,直接使用sfnttool提取子集,发现提取出来的并不是子集想要的。

  后来开始看sfnttool源代码,发现sfnttool会根据当前系统使用的字符集编码(我的系统使用GBK)把输入的提取字符串转换成Unicode码。也就是说我输入的是BIG5编码的数据,而sfnttool把这些数据当做是GBK编码的数据来转成Unicode,这显然是有问题的。

  一个最简单的办法把电脑系统的代码页切换到950(BIG5),即切换到繁体版Windows,然后重新再使用这个工具。把BIG5编码的字符串输入到sfnttool另外一个办法就是修改下sfnttool源代码可配置当前输入的是什么编码的数据,以及正确的转成对应的Unicode。

b、 还有些细节

  mingliu.ttc,細黑體_0.ttc,ttc可以使用FontCreator转成mingliu_0.ttf,細黑體_0.ttf

  从 "mingliu_0.ttf" 提取字符子集,仅仅提取几个字符就有4M多大小(源ttf有26M)。而提取常用汉字3000个左右,使用 "細黑體_0.ttf" 提取子集仅仅2.5M, 使用 "mingliu_0.ttf" 提取的子集有8.5M 。(估计是跟字体库本身设置了什么有关)

  另外网上还有一个TTF字体裁剪小工具“TTF字体库裁剪转换工具”:

  经过测试有部分字体不支持,也不支持繁体字体裁剪。工具下载地址:https://download.csdn.net/download/leichelle/10673940

参考资料:

【工具】在TTF字体中提取想要的文字,让字体文件变迷你
https://blog.csdn.net/ldpjay/article/details/46561031

大坑已填,留个纪念:裁剪ttf,让其大小更适用于移动设备与网页
https://blog.csdn.net/tianxiawuzhei/article/details/45720563

sfntly源代码
https://github.com/googlei18n/sfntly
https://github.com/rillig/sfntly

谷歌开源的字体提取工具 sfntly 的正确打开方式
https://www.skiy.net/201706064777.html

中文汉字 | ASCII | Unicode互相转换工具 - aTool在线工具
http://www.atool.org/chinese2unicode.php

----------------------------------------分割线---------------------------------------------

原文作者提供了如何利用谷歌的sfntly来精简字体包,但是只能以

    java -jar sfnttool.jar -s ‘要进行提取的文案‘ 提取前的文件名.ttf 提取后的文件名.ttf

  的形式来对命令行输入的字符串生成字体包。

  我在源代码的基础上加上了读取文件的功能,使之可以方便的将字符集配置在文本里。

  下面是修改过的SfntTool.java源代码,直接覆盖原文件即可: 

 /*
* Copyright 2011 Google Inc. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/ package com.google.typography.font.tools.sfnttool; import com.google.typography.font.sfntly.Font;
import com.google.typography.font.sfntly.FontFactory;
import com.google.typography.font.sfntly.Tag;
import com.google.typography.font.sfntly.data.WritableFontData;
import com.google.typography.font.sfntly.table.core.CMapTable;
import com.google.typography.font.tools.conversion.eot.EOTWriter;
import com.google.typography.font.tools.conversion.woff.WoffWriter;
import com.google.typography.font.tools.subsetter.HintStripper;
import com.google.typography.font.tools.subsetter.RenumberingSubsetter;
import com.google.typography.font.tools.subsetter.Subsetter; import java.io.File;
import java.io.FileInputStream;
import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set; /**
* @author Raph Levien
*/
public class SfntTool {
private boolean strip = false;
private String subsetString = null;
private boolean woff = false;
private boolean eot = false;
private boolean mtx = false; public static void main(String[] args) throws IOException {
SfntTool tool = new SfntTool();
File fontFile = null;
File outputFile = null;
boolean bench = false;
int nIters = 1; for (int i = 0; i < args.length; i++) {
String option = null;
if (args[i].charAt(0) == '-') {
option = args[i].substring(1);
} if (option != null) {
if (option.equals("help") || option.equals("?")) {
printUsage();
System.exit(0);
} else if (option.equals("b") || option.equals("bench")) {
nIters = 10000;
} else if (option.equals("h") || option.equals("hints")) {
tool.strip = true;
} else if (option.equals("s") || option.equals("string")) {
File filename = new File(args[i + 1]);
InputStreamReader reader = new InputStreamReader(new FileInputStream(filename));
BufferedReader br = new BufferedReader(reader);
String line = br.readLine();
tool.subsetString = line;
br.close();
// tool.subsetString = args[i + 1];
i++;
} else if (option.equals("w") || option.equals("woff")) {
tool.woff = true;
} else if (option.equals("e") || option.equals("eot")) {
tool.eot = true;
} else if (option.equals("x") || option.equals("mtx")) {
tool.mtx = true;
} else {
printUsage();
System.exit(1);
}
} else {
if (fontFile == null) {
fontFile = new File(args[i]);
} else {
outputFile = new File(args[i]);
break;
}
}
} if (tool.woff && tool.eot) {
System.out.println("WOFF and EOT options are mutually exclusive");
System.exit(1);
} if (fontFile != null && outputFile != null) {
tool.subsetFontFile(fontFile, outputFile, nIters);
} else {
printUsage();
}
} private static final void printUsage() {
System.out.println("Subset [-?|-h|-help] [-b] [-s string] fontfile outfile");
System.out.println("Prototype font subsetter");
System.out.println("\t-?,-help\tprint this help information");
System.out.println("\t-s,-string\t String to subset");
System.out.println("\t-b,-bench\t Benchmark (run 10000 iterations)");
System.out.println("\t-h,-hints\t Strip hints");
System.out.println("\t-w,-woff\t Output WOFF format");
System.out.println("\t-e,-eot\t Output EOT format");
System.out.println("\t-x,-mtx\t Enable Microtype Express compression for EOT format");
} public void subsetFontFile(File fontFile, File outputFile, int nIters) throws IOException {
FontFactory fontFactory = FontFactory.getInstance();
FileInputStream fis = null;
try {
fis = new FileInputStream(fontFile);
byte[] fontBytes = new byte[(int) fontFile.length()];
fis.read(fontBytes);
Font[] fontArray = null;
fontArray = fontFactory.loadFonts(fontBytes);
Font font = fontArray[0];
List<CMapTable.CMapId> cmapIds = new ArrayList<CMapTable.CMapId>();
cmapIds.add(CMapTable.CMapId.WINDOWS_BMP);
byte[] newFontData = null;
for (int i = 0; i < nIters; i++) {
Font newFont = font;
if (subsetString != null) {
Subsetter subsetter = new RenumberingSubsetter(newFont, fontFactory);
subsetter.setCMaps(cmapIds, 1);
List<Integer> glyphs = GlyphCoverage.getGlyphCoverage(font, subsetString);
subsetter.setGlyphs(glyphs);
Set<Integer> removeTables = new HashSet<Integer>();
// Most of the following are valid tables, but we don't renumber them yet, so strip
removeTables.add(Tag.GDEF);
removeTables.add(Tag.GPOS);
removeTables.add(Tag.GSUB);
removeTables.add(Tag.kern);
removeTables.add(Tag.hdmx);
removeTables.add(Tag.vmtx);
removeTables.add(Tag.VDMX);
removeTables.add(Tag.LTSH);
removeTables.add(Tag.DSIG);
removeTables.add(Tag.vhea);
// AAT tables, not yet defined in sfntly Tag class
removeTables.add(Tag.intValue(new byte[] { 'm', 'o', 'r', 't' }));
removeTables.add(Tag.intValue(new byte[] { 'm', 'o', 'r', 'x' }));
subsetter.setRemoveTables(removeTables);
newFont = subsetter.subset().build();
}
if (strip) {
Subsetter hintStripper = new HintStripper(newFont, fontFactory);
Set<Integer> removeTables = new HashSet<Integer>();
removeTables.add(Tag.fpgm);
removeTables.add(Tag.prep);
removeTables.add(Tag.cvt);
removeTables.add(Tag.hdmx);
removeTables.add(Tag.VDMX);
removeTables.add(Tag.LTSH);
removeTables.add(Tag.DSIG);
removeTables.add(Tag.vhea);
hintStripper.setRemoveTables(removeTables);
newFont = hintStripper.subset().build();
} FileOutputStream fos = new FileOutputStream(outputFile);
if (woff) {
WritableFontData woffData = new WoffWriter().convert(newFont);
woffData.copyTo(fos);
} else if (eot) {
WritableFontData eotData = new EOTWriter(mtx).convert(newFont);
eotData.copyTo(fos);
} else {
fontFactory.serializeFont(newFont, fos);
}
}
} finally {
if (fis != null) {
fis.close();
}
}
}
}

可输入文件的优化代码

替换完毕后,还是用ant来编译jar包,编译好后用如下命令行语句来精简字体包:

java -jar sfnttool.jar -s "filter.txt" Font_old.ttf Font_new.ttf

原文:https://blog.csdn.net/xp406181/article/details/79232571

----------------------------------------分割线---------------------------------------------

附常用汉字2500多个

一乙二十丁厂七卜人入八九几儿了力乃刀又三于干亏士工土才寸下大丈与万上小口巾山千乞川亿个勺久凡及夕丸么广亡门义之尸弓己已子卫也女飞刃习叉马乡丰王井开夫天无元专云扎艺木五支厅不太犬区历尤友匹车巨牙屯比互切瓦止少日中冈贝内水见午牛手毛气升长仁什片仆化仇币仍仅斤爪反介父从今凶分乏公仓月氏勿欠风丹匀乌凤勾文六方火为斗忆订计户认心尺引丑巴孔队办以允予劝双书幻玉刊示末未击打巧正扑扒功扔去甘世古节本术可丙左厉右石布龙平灭轧东卡北占业旧帅归且旦目叶甲申叮电号田由史只央兄叼叫另叨叹四生失禾丘付仗代仙们仪白仔他斥瓜乎丛令用甩印乐句匆册犯外处冬鸟务包饥主市立闪兰半汁汇头汉宁穴它讨写让礼训必议讯记永司尼民出辽奶奴加召皮边发孕圣对台矛纠母幼丝式刑动扛寺吉扣考托老执巩圾扩扫地扬场耳共芒亚芝朽朴机权过臣再协西压厌在有百存而页匠夸夺灰达列死成夹轨邪划迈毕至此贞师尘尖劣光当早吐吓虫曲团同吊吃因吸吗屿帆岁回岂刚则肉网年朱先丢舌竹迁乔伟传乒乓休伍伏优伐延件任伤价份华仰仿伙伪自血向似后行舟全会杀合兆企众爷伞创肌朵杂危旬旨负各名多争色壮冲冰庄庆亦刘齐交次衣产决充妄闭问闯羊并关米灯州汗污江池汤忙兴宇守宅字安讲军许论农讽设访寻那迅尽导异孙阵阳收阶阴防奸如妇好她妈戏羽观欢买红纤级约纪驰巡寿弄麦形进戒吞远违运扶抚坛技坏扰拒找批扯址走抄坝贡攻赤折抓扮抢孝均抛投坟抗坑坊抖护壳志扭块声把报却劫芽花芹芬苍芳严芦劳克苏杆杠杜材村杏极李杨求更束豆两丽医辰励否还歼来连步坚旱盯呈时吴助县里呆园旷围呀吨足邮男困吵串员听吩吹呜吧吼别岗帐财针钉告我乱利秃秀私每兵估体何但伸作伯伶佣低你住位伴身皂佛近彻役返余希坐谷妥含邻岔肝肚肠龟免狂犹角删条卵岛迎饭饮系言冻状亩况床库疗应冷这序辛弃冶忘闲间闷判灶灿弟汪沙汽沃泛沟没沈沉怀忧快完宋宏牢究穷灾良证启评补初社识诉诊词译君灵即层尿尾迟局改张忌际陆阿陈阻附妙妖妨努忍劲鸡驱纯纱纳纲驳纵纷纸纹纺驴纽奉玩环武青责现表规抹拢拔拣担坦押抽拐拖拍者顶拆拥抵拘势抱垃拉拦拌幸招坡披拨择抬其取苦若茂苹苗英范直茄茎茅林枝杯柜析板松枪构杰述枕丧或画卧事刺枣雨卖矿码厕奔奇奋态欧垄妻轰顷转斩轮软到非叔肯齿些虎虏肾贤尚旺具果味昆国昌畅明易昂典固忠咐呼鸣咏呢岸岩帖罗帜岭凯败贩购图钓制知垂牧物乖刮秆和季委佳侍供使例版侄侦侧凭侨佩货依的迫质欣征往爬彼径所舍金命斧爸采受乳贪念贫肤肺肢肿胀朋股肥服胁周昏鱼兔狐忽狗备饰饱饲变京享店夜庙府底剂郊废净盲放刻育闸闹郑券卷单炒炊炕炎炉沫浅法泄河沾泪油泊沿泡注泻泳泥沸波泼泽治怖性怕怜怪学宝宗定宜审宙官空帘实试郎诗肩房诚衬衫视话诞询该详建肃录隶居届刷屈弦承孟孤陕降限妹姑姐姓始驾参艰线练组细驶织终驻驼绍经贯奏春帮珍玻毒型挂封持项垮挎城挠政赴赵挡挺括拴拾挑指垫挣挤拼挖按挥挪某甚革荐巷带草茧茶荒茫荡荣故胡南药标枯柄栋相查柏柳柱柿栏树要咸威歪研砖厘厚砌砍面耐耍牵残殃轻鸦皆背战点临览竖省削尝是盼眨哄显哑冒映星昨畏趴胃贵界虹虾蚁思蚂虽品咽骂哗咱响哈咬咳哪炭峡罚贱贴骨钞钟钢钥钩卸缸拜看矩怎牲选适秒香种秋科重复竿段便俩贷顺修保促侮俭俗俘信皇泉鬼侵追俊盾待律很须叙剑逃食盆胆胜胞胖脉勉狭狮独狡狱狠贸怨急饶蚀饺饼弯将奖哀亭亮度迹庭疮疯疫疤姿亲音帝施闻阀阁差养美姜叛送类迷前首逆总炼炸炮烂剃洁洪洒浇浊洞测洗活派洽染济洋洲浑浓津恒恢恰恼恨举觉宣室宫宪突穿窃客冠语扁袄祖神祝误诱说诵垦退既屋昼费陡眉孩除险院娃姥姨姻娇怒架贺盈勇怠柔垒绑绒结绕骄绘给络骆绝绞统耕耗艳泰珠班素蚕顽盏匪捞栽捕振载赶起盐捎捏埋捉捆捐损都哲逝捡换挽热恐壶挨耻耽恭莲莫荷获晋恶真框桂档桐株桥桃格校核样根索哥速逗栗配翅辱唇夏础破原套逐烈殊顾轿较顿毙致柴桌虑监紧党晒眠晓鸭晃晌晕蚊哨哭恩唤啊唉罢峰圆贼贿钱钳钻铁铃铅缺氧特牺造乘敌秤租积秧秩称秘透笔笑笋债借值倚倾倒倘俱倡候俯倍倦健臭射躬息徒徐舰舱般航途拿爹爱颂翁脆脂胸胳脏胶脑狸狼逢留皱饿恋桨浆衰高席准座脊症病疾疼疲效离唐资凉站剖竞部旁旅畜阅羞瓶拳粉料益兼烤烘烦烧烛烟递涛浙涝酒涉消浩海涂浴浮流润浪浸涨烫涌悟悄悔悦害宽家宵宴宾窄容宰案请朗诸读扇袜袖袍被祥课谁调冤谅谈谊剥恳展剧屑弱陵陶陷陪娱娘通能难预桑绢绣验继球理捧堵描域掩捷排掉堆推掀授教掏掠培接控探据掘职基著勒黄萌萝菌菜萄菊萍菠营械梦梢梅检梳梯桶救副票戚爽聋袭盛雪辅辆虚雀堂常匙晨睁眯眼悬野啦晚啄距跃略蛇累唱患唯崖崭崇圈铜铲银甜梨犁移笨笼笛符第敏做袋悠偿偶偷您售停偏假得衔盘船斜盒鸽悉欲彩领脚脖脸脱象够猜猪猎猫猛馅馆凑减毫麻痒痕廊康庸鹿盗章竟商族旋望率着盖粘粗粒断剪兽清添淋淹渠渐混渔淘液淡深婆梁渗情惜惭悼惧惕惊惨惯寇寄宿窑密谋谎祸谜逮敢屠弹随蛋隆隐婚婶颈绩绪续骑绳维绵绸绿琴斑替款堪搭塔越趁趋超提堤博揭喜插揪搜煮援裁搁搂搅握揉斯期欺联散惹葬葛董葡敬葱落朝辜葵棒棋植森椅椒棵棍棉棚棕惠惑逼厨厦硬确雁殖裂雄暂雅辈悲紫辉敞赏掌晴暑最量喷晶喇遇喊景践跌跑遗蛙蛛蜓喝喂喘喉幅帽赌赔黑铸铺链销锁锄锅锈锋锐短智毯鹅剩稍程稀税筐等筑策筛筒答筋筝傲傅牌堡集焦傍储奥街惩御循艇舒番释禽腊脾腔鲁猾猴然馋装蛮就痛童阔善羡普粪尊道曾焰港湖渣湿温渴滑湾渡游滋溉愤慌惰愧愉慨割寒富窜窝窗遍裕裤裙谢谣谦属屡强粥疏隔隙絮嫂登缎缓编骗缘瑞魂肆摄摸填搏塌鼓摆携搬摇搞塘摊蒜勤鹊蓝墓幕蓬蓄蒙蒸献禁楚想槐榆楼概赖酬感碍碑碎碰碗碌雷零雾雹输督龄鉴睛睡睬鄙愚暖盟歇暗照跨跳跪路跟遣蛾蜂嗓置罪罩错锡锣锤锦键锯矮辞稠愁筹签简毁舅鼠催傻像躲微愈遥腰腥腹腾腿触解酱痰廉新韵意粮数煎塑慈煤煌满漠源滤滥滔溪溜滚滨粱滩慎誉塞谨福群殿辟障嫌嫁叠缝缠静碧璃墙撇嘉摧截誓境摘摔聚蔽慕暮蔑模榴榜榨歌遭酷酿酸磁愿需弊裳颗嗽蜻蜡蝇蜘赚锹锻舞稳算箩管僚鼻魄貌膜膊膀鲜疑馒裹敲豪膏遮腐瘦辣竭端旗精歉熄熔漆漂漫滴演漏慢寨赛察蜜谱嫩翠熊凳骡缩慧撕撒趣趟撑播撞撤增聪鞋蕉蔬横槽樱橡飘醋醉震霉瞒题暴瞎影踢踏踩踪蝶蝴嘱墨镇靠稻黎稿稼箱箭篇僵躺僻德艘膝膛熟摩颜毅糊遵潜潮懂额慰劈操燕薯薪薄颠橘整融醒餐嘴蹄器赠默镜赞篮邀衡膨雕磨凝辨辩糖糕燃澡激懒壁避缴戴擦鞠藏霜霞瞧蹈螺穗繁辫赢糟糠燥臂翼骤鞭覆蹦镰翻鹰警攀蹲颤瓣爆疆壤耀躁嚼嚷籍魔灌蠢霸露囊罐翎qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890《》?!,。妩媚曳鎏怡廓沧

字体推荐: 
苹果PingHei三款 
腾祥嘉丽细圆简 
苹方字体 
微软雅黑light 
汉仪旗黑H2312F45

推荐链接:

http://www.zhaozi.cn/html/fonts/china/riben/2010-11-18/21992.html 
https://www.zhihu.com/question/20727176 
http://daily.zhihu.com/story/3630127 
http://www.epinv.com/post/5740.html 
https://sanwen8.cn/p/3a5dO2X.html 
https://www.zhihu.com/question/20922638 
http://www.fontke.com/font/10552118/ 
https://www.zhihu.com/question/24878730 
http://blog.sina.com.cn/s/blog_62c692fd0100fjtn.html

[转]TrueType(TTF)字体文件裁剪(支持简体中文,繁体中文TTF字体裁剪)的更多相关文章

  1. Win8.1 MSDN各版本下载(64位/32位,简体中文,繁体中文,英文),X86&X64,EN,CHS,CHT

    英文64位ed2k://|file|en_windows_8_1_x64_dvd_2707217.iso|3899295744|8E604054013D21209B851E41DC19F6F5|/ 英 ...

  2. 应用程序加载外部字体文件(使用AddFontResource API函数指定字体)

    /* MSDN: Any application that adds or removes fonts from the system font table should notify other w ...

  3. ttf格式文件

    TTF(TrueTypeFont):是一种字库名称.TTF文件:是Apple公司和Microsoft公司共同推出的字体文件格式.要使用的下载的字体文件只要把它(*.ttf)放到C:\WINDOWS\F ...

  4. js分析 猫_眼_电_影 字体文件 @font-face

    0. 参考 https://developer.mozilla.org/zh-CN/docs/Web/CSS/@font-face 这是一个叫做@font-face 的CSS @规则 ,它允许网页开发 ...

  5. 自制按钮图标的两种方法: image sprite和svg字体文件

    用image sprite和svg字体文件这两种方法,都能够极大地减少小图形文件的数量, 从而减少服务器请求和带宽需求.提高网页的响应速度. 一.建立SVG字体文件 iconmoon 是一个在线工具, ...

  6. iOS使用自定义字体的方法(内置和任意下载ttf\otf\ttc字体文件)

    最近做了个有关阅读的应用,使用了自定义字体,学习了一下这方面的知识. 1.首先是最简单也普遍的做法,打包内置字符库文件: 把字体库文件添加到工程,如font1.ttf添加到工程,然后在工程plist添 ...

  7. [微信小程序]字体文件,字体图标(.ttf,.woff,woff2)等无法显示问题

    一. 背景 项目引用了第三方UI框架Vant-weapp,但是前几天Vant的cdn被运营商封禁,导致van-icon无法使用. 有赞官方在Github上给出了在小程序app.wxss上添加以下代码的 ...

  8. 怎么才能使服务器Nginx(或者Apache)支持字体文件

    为了在前端正确地显示字体,浏览器必须使用正确的http header来接受字体文件.如果服务器没有设置要求的头信息,那么有些浏览器就会在控制台报错或者直接不能显示. 可能你的服务器已经配置好了,你无须 ...

  9. cocos2d-x 中 TTF 字体文件的位置

    cocos2d-x 中,字体文件需要保存在 fonts 文件夹中,如果字体路径中没有 fonts/ 会自动添加上这个文件夹. 如果字体名称没有 .ttf 后缀,也会自动加上这个后缀. unsigned ...

随机推荐

  1. Dockerfile(从无到有创建镜像)

    本文原始地址:https://sitoi.cn/posts/43818.html 结构 DockerFile分为四部分组成: 基础镜像信息 维护者信息 镜像操作指令 容器启动时执行指令 基础镜像信息 ...

  2. Istio技术与实践06:史上最全!Istio安装参数介绍

    一. CertManage Istio-1.0版本新加入的组件,利用ACME为Istio签发证书 Key Default Value Description certmanager.enabled T ...

  3. 转,关于TCP粘包问题的一些思路

    TCP粘包分析 一 .两个简单概念长连接与短连接:1.长连接 Client方与Server方先建立通讯连接,连接建立后不断开, 然后再进行报文发送和接收. 2.短连接 Client方与Server每进 ...

  4. PAT 乙级 1008.数组元素循环右移问题 C++/Java

    1008 数组元素循环右移问题 (20 分) 题目来源 一个数组A中存有N(>)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥)个位置,即将A中的数据由(A​0​​A​1​​⋯ ...

  5. ansible(三)

    setup ansible_all_ipv4_addresses # ipv4的所有地址 ansible_all_ipv6_addresses # ipv6的所有地址 ansible_date_tim ...

  6. 项目Beta冲刺--7/7

    项目Beta冲刺--7/7 作业要求 这个作业属于哪个课程 软件工程1916-W(福州大学) 这个作业要求在哪里 项目Beta冲刺 团队名称 基于云的胜利冲锋队 项目名称 云评:高校学生成绩综合评估及 ...

  7. TCP/IP通信过程(以发送电子邮件为例)(转)

    1.应用程序处理 (1)A用户启动邮件应用程序,填写收件人邮箱和发送内容,点击“发送”,开始TCP/IP通信: (2)应用程序对发送的内容进行编码处理,这一过程相当于OSI的表示层功能: (3)由A用 ...

  8. Mobx | 强大的状态管理工具 | 可以用Mobx来替代掉redux

    来源简书 电梯直达 https://www.jianshu.com/p/505d9d9fe36a Mobx是一个功能强大,上手非常容易的状态管理工具.就连redux的作者也曾经向大家推荐过它,在不少情 ...

  9. python面试题&练习题之函数

    1.写函数,接收两个数字参数,返回最大值例如:传入:10,20返回:20 def res_max(number1,number2): l1 = [] l1.append(number1) l1.app ...

  10. iOS应用代码注入防护

    在应用开发过程中,我们不仅仅需要完成正常的业务逻辑,考虑应用性能.代码健壮相关的问题,我们有时还需要考虑到应用安全的问题.那么应用安全的问题涉及到很多方面.比如防止静态分析的,代码混淆.逻辑混淆:防止 ...