您当前的位置:首页 > 计算机 > 系统应用 > Linux

Linux 字体管理相关

时间:07-17来源:作者:点击数:

1基本上都用font-config这个包来。

几个常用命令保命先:

fc-list 查看系统上已安装的字体

fc-cache -fv 或者fc-cache -frv 用于生成字体cache或者重新生成字体cache

fc-cat -rv 查看fc cache内的内容

字体名称表示及含义:

 <families>-<point sizes>:<name1>=<values1>:<name2>=<values2>...

由3部分组成 :字体families列表,字体点正大小,以及附加属性列表。

在fonts.conf的man手册列举了几个例子

         Name                            Meaning
         ----------------------------------------------------------
         Times-12                        12 point Times Roman
         Times-12:bold                   12 point Times Bold
         Courier:italic                  Courier Italic in the default size
         Monospace:matrix=1 .1 0 1       The users preferred monospace font
                                         with artificial obliquing

其中family)中的 '\', '-', ':', ',' 字符必须要使用'\'进行转义。 类似的,属性值(values)中的 '\', '=', '_', ':', ',' 也必须要使用'\'进行转义。

比如

fc-list | grep CESI_FS_GB13000
/usr/share/fonts/fonts-cesi/CESI_FS_GB13000.TTF: CESI仿宋\-GB13000,CESI_FS_GB13000:style=Regular

这里面字体名称表示

CESI仿宋\-GB13000,CESI_FS_GB13000:style=Regular

名字列表为CESI仿宋\-GB13000,CESI_FS_GB13000 中横线就用了反斜线转义。

约定成俗的字体样式:

字体配置已经从字体匹配中分离开来,应用程序可能想要自己去匹配合适的字体,但他可以从fontconfig的库里面或则好可以用的字体列表,这样可以将字体安装和配置集中化处理,降低不同应用程序对字体安装识别和匹配的难度。

字体样式本质上可以包含任意的属性,但实际上有一些约定成俗的属性和类型。

fontconfig利用一些属性作为字体匹配以及补全,另外一些属性可能做为应用程序渲染的辅助信息。

比如微软雅黑字体,来查看一下

"msyhbd.ttf" 0 "Microsoft YaHei,微软雅黑:familylang=en,zh-cn:style=Negreta,tučné,fed,Fett,Έντονα,Bold,Negrita,Lihavoitu,Gras,Félkövér,Grassetto,Vet,Halvfet,Pogrubiony,Negrito,Полужирный,Fet,Kalın,Krepko,Lodia:stylelang=ca,cs,da,de,el,en,es,fi,fr,hu,it,nl,no,pl,pt,ru,sv,tr,sl,eu:fullname=Microsoft YaHei Negreta,Microsoft YaHei tučné,Microsoft YaHei fed,Microsoft YaHei Fett,Microsoft YaHei Έντονα,Microsoft YaHei Bold,Microsoft YaHei Negrita,Microsoft YaHei Lihavoitu,Microsoft YaHei Gras,Microsoft YaHei Félkövér,Microsoft YaHei Grassetto,Microsoft YaHei Vet,Microsoft YaHei Halvfet,Microsoft YaHei Pogrubiony,Microsoft YaHei Negrito,Microsoft YaHei Полужирный,Microsoft YaHei Fet,Microsoft YaHei Kalın,Microsoft YaHei Krepko,Microsoft YaHei Lodia,微软雅黑 Bold:fullnamelang=ca,cs,da,de,el,en,es,fi,fr,hu,it,nl,no,pl,pt,ru,sv,tr,sl,eu,zh-cn:slant=0:weight=200:width=100:foundry=MS  :index=0:outline=True:scalable=True:charset=20-7f a0-127 12b 12e-13a 13c-17f 192 1ce 1d0 1d2 1d4 1d6 1d8 1da 1dc 1f9 1fb-1ff 218-219 251 261 2c6-2c7 2c9-2cb 2d8-2dd 37e 384-38a 38c 38e-3a1 3a3-3ce 3d0-3fb 401-40c 40e-44f 451-45c 45e-45f 490-491 1e80-1e85 1ef2-1ef3 2010 2013-2016 2018-201e 2020-2022 2024-2027 2030 2032-2033 2035 2039-203c 203e 2044 2074-2075 2077-2078 207f 20a0-20b1 2103 2105 2109 2113 2116 2121-2122 2126 212e 215b-215e 2160-216b 2170-2179 2190-2193 2196-2199 2202 2206 2208 220f 2211-2212 2215 2219-221a 221d-2220 2223 2225 2227-222b 222e 2234-2237 223d 2248 224c 2252 2260-2261 2264-2267 226e-226f 2295 2299 22a5 22bf 2312 2460-2469 2474-249b 2500-254b 2550-2573 2581-258f 2593-2595 25a0-25a1 25aa-25ab 25b2-25b3 25bc-25bd 25c6-25c7 25ca-25cb 25ce-25cf 25e2-25e6 2605-2606 2609 2640 2642 2e81 2e84 2e88 2e8b-2e8c 2e97 2ea7 2eaa 2eae 2eb3 2eb6-2eb7 2ebb 3000-303f 3041-3096 3099-30ff 3105-312b 3190-31b7 32a3 33ce 33d1-33d2 33d5 3400-4db5 4e00-9fa5 9fb4-9fb9 9fbb f92c f979 f995 f9e7 f9f1 fa0c-fa0f fa11 fa13-fa14 fa18 fa1f-fa21 fa23-fa24 fa27-fa29 fe10-fe19 fe30-fe52 fe54-fe66 fe68-fe6b ff01-ff9f ffa1-ffbe ffc2-ffc7 ffca-ffcf ffd2-ffd7 ffda-ffdc ffe0-ffe6 ffe8-ffee:lang=aa|af|av|ay|be|bg|bi|br|bs|ca|ce|ch|co|cs|cy|da|de|el|en|eo|es|et|eu|fi|fj|fo|fr|fur|fy|gd|gl|gv|ho|hr|hu|ia|id|ie|ik|io|is|it|kum|lb|lez|lt|mg|mt|nb|nds|nl|nn|no|nr|nso|ny|oc|om|os|pl|pt|rm|ru|se|sel|sk|sl|sma|smj|smn|so|sq|sr|ss|st|sv|sw|tk|tl|tn|tr|ts|uk|uz|vo|vot|wa|wen|wo|xh|yap|zh-cn|zh-sg|zu|an|crh|csb|fil|hsb|ht|jv|kj|ku-tr|kwm|lg|li|ms|na|ng|pap-an|pap-aw|rn|rw|sc|sg|sn|su|za:fontversion=394527:capability=otlayout\\:hani:fontformat=TrueType:decorative=False:postscriptname=MicrosoftYaHei-Bold:color=False:symbol=False:variable=False"

按照字体名的3个部分分离以及不同属性分离如下

"msyhbd.ttf" 
0 
"Microsoft YaHei,微软雅黑

:familylang=en,zh-cn

:style=Negreta,tučné,fed,Fett,Έντονα,Bold,Negrita,Lihavoitu,Gras,Félkövér,Grassetto,Vet,Halvfet,Pogrubiony,Negrito,Полужирный,Fet,Kalın,Krepko,Lodia

:stylelang=ca,cs,da,de,el,en,es,fi,fr,hu,it,nl,no,pl,pt,ru,sv,tr,sl,eu

:fullname=Microsoft YaHei Negreta,Microsoft YaHei tučné,Microsoft YaHei fed,Microsoft YaHei Fett,Microsoft YaHei Έντονα,Microsoft YaHei Bold,Microsoft YaHei Negrita,Microsoft YaHei Lihavoitu,Microsoft YaHei Gras,Microsoft YaHei Félkövér,Microsoft YaHei Grassetto,Microsoft YaHei Vet,Microsoft YaHei Halvfet,Microsoft YaHei Pogrubiony,Microsoft YaHei Negrito,Microsoft YaHei Полужирный,Microsoft YaHei Fet,Microsoft YaHei Kalın,Microsoft YaHei Krepko,Microsoft YaHei Lodia,微软雅黑 
Bold

:fullnamelang=ca,cs,da,de,el,en,es,fi,fr,hu,it,nl,no,pl,pt,ru,sv,tr,sl,eu,zh-cn

:slant=0

:weight=200

:width=100

:foundry=MS  

:index=0

:outline=True

:scalable=True

:charset=20-7f a0-127 12b 12e-13a 13c-17f 192 1ce 1d0 1d2 1d4 1d6 1d8 1da 1dc 1f9 1fb-1ff 218-219 251 261 2c6-2c7 2c9-2cb 2d8-2dd 37e 384-38a 38c 38e-3a1 3a3-3ce 3d0-3fb 401-40c 40e-44f 451-45c 45e-45f 490-491 1e80-1e85 1ef2-1ef3 2010 2013-2016 2018-201e 2020-2022 2024-2027 2030 2032-2033 2035 2039-203c 203e 2044 2074-2075 2077-2078 207f 20a0-20b1 2103 2105 2109 2113 2116 2121-2122 2126 212e 215b-215e 2160-216b 2170-2179 2190-2193 2196-2199 2202 2206 2208 220f 2211-2212 2215 2219-221a 221d-2220 2223 2225 2227-222b 222e 2234-2237 223d 2248 224c 2252 2260-2261 2264-2267 226e-226f 2295 2299 22a5 22bf 2312 2460-2469 2474-249b 2500-254b 2550-2573 2581-258f 2593-2595 25a0-25a1 25aa-25ab 25b2-25b3 25bc-25bd 25c6-25c7 25ca-25cb 25ce-25cf 25e2-25e6 2605-2606 2609 2640 2642 2e81 2e84 2e88 2e8b-2e8c 2e97 2ea7 2eaa 2eae 2eb3 2eb6-2eb7 2ebb 3000-303f 3041-3096 3099-30ff 3105-312b 3190-31b7 32a3 33ce 33d1-33d2 33d5 3400-4db5 4e00-9fa5 9fb4-9fb9 9fbb f92c f979 f995 f9e7 f9f1 fa0c-fa0f fa11 fa13-fa14 fa18 fa1f-fa21 fa23-fa24 fa27-fa29 fe10-fe19 fe30-fe52 fe54-fe66 fe68-fe6b ff01-ff9f ffa1-ffbe ffc2-ffc7 ffca-ffcf ffd2-ffd7 ffda-ffdc ffe0-ffe6 ffe8-ffee

:lang=aa|af|av|ay|be|bg|bi|br|bs|ca|ce|ch|co|cs|cy|da|de|el|en|eo|es|et|eu|fi|fj|fo|fr|fur|fy|gd|gl|gv|ho|hr|hu|ia|id|ie|ik|io|is|it|kum|lb|lez|lt|mg|mt|nb|nds|nl|nn|no|nr|nso|ny|oc|om|os|pl|pt|rm|ru|se|sel|sk|sl|sma|smj|smn|so|sq|sr|ss|st|sv|sw|tk|tl|tn|tr|ts|uk|uz|vo|vot|wa|wen|wo|xh|yap|zh-cn|zh-sg|zu|an|crh|csb|fil|hsb|ht|jv|kj|ku-tr|kwm|lg|li|ms|na|ng|pap-an|pap-aw|rn|rw|sc|sg|sn|su|za

:fontversion=394527

:capability=otlayout\\

:hani

:fontformat=TrueType

:decorative=False

:postscriptname=MicrosoftYaHei-Bold

:color=False

:symbol=False

:variable=False"

可以根据下面(白嫖自别人的翻译,也可以直接man fonts.conf),对照属性的含义。

属性(Property)   类型    描述[以"微软雅黑粗体"为例,将其对应的属性值放于{}中]
        --------------------------------------------------------------
        family          String   字族名称{"Microsoft YaHei" "微软雅黑"}
        familylang      String   每个字族名称所对应的语言{"en" "zh-cn"}
        style           String   字体风格名称(会覆盖slant与weight){"Bold" "Félkövér" "Полужирный" ...}
        stylelang       String   每个字体风格名称所对应的语言{"en" "hu" "ru" ...}
        fullname        String   字体全名(通常包含style){"Microsoft YaHei Bold" "微软雅黑 Bold" ...}
        fullnamelang    String   每个字体全名所对应的语言{"en" "zh-cn" ...}
        slant           Int      倾斜度{0}。分为:Italic(100,斜体), oblique(110,合成斜体), roman(0,正体)
        weight          Int      粗细程度{200},从0-210,由最细到最粗。例如:light(50,细), regular(80,一般), medium(100,中等), bold(200,粗)
        width           Int      宽度{100},从50-200,由最窄到最宽。例如:condensed(75,压缩), normal(100,正常), expanded(125,加宽)
        size            Double   磅大小(point size),单位是绝对大小的"磅"(=1/72英寸)。[默认值是"12"]
        pixelsize       Double   像素大小(pixel size),单位是显示屏上的"像素"。[pixelsize = (size*scale*dpi)/72]
        aspect          Double   在微调(hinting)前将字形(glyph)水平拉宽的倍数。
        spacing         Int      字符间距。分为:proportional(0,变宽), dual(90,双宽), mono(100,等宽), charcell(110,字符单元)
        foundry         String   字体制造商名称{"microsoft"}
        antialias       Bool     渲染字形(glyph)时是否开启抗锯齿功能[建议对矢量字体设为"true"]
        hinting         Bool     渲染字形(glyph)时是否开启微调功能(包括内嵌微调与自动微调)[建议对矢量字体设为"true"]
        autohint        Bool     "true"表示只使用自动微调;"false"表示优先使用内嵌微调,但对于没有内嵌微调的字体仍会使用自动微调。[建议设为"false"]
        hintstyle       Int      微调的程度(同时作用于内嵌微调与自动微调)。分为:none(0,关闭), slight(1,轻度), medium(2,中度), full(3,完全)
        verticallayout  Bool     是否采用竖直排版
        globaladvance   Bool     是否使用字体提供的全局间距值(即将被废弃)
        file            String   字体文件的名称
        index           Int      字体文件内该字体的索引号,由"0"开始计数。
        ftface          FT_Face  使用指定的 Freetype face 对象
        rasterizer      String   使用哪种渲染引擎(rasterizer)(即将被废弃)
        outline         Bool     字形(glyph)是否具有轮廓线{True}
        scalable        Bool     字形(glyph)是否可以缩放{True}
        scale           Double   磅->像素(point->pixel)的缩放系数[默认值是"1"]
        dpi             Double   目标dpi(像素/英寸)值
        rgba            Int      LCD子像素的排列顺序。分为:unknown(0,未知), rgb(1), bgr(2), vrgb(3), vbgr(4), none(5,无子像素)。
        lcdfilter       Int      LCD filter 的风格
        minspace        Bool     是否消除行间距(也就是使用最小行间距)
        charset         CharSet  字体所支持的Unicode字符的列表{太长,省略}
        lang            String   字体所支持的RFC-3066语言的列表{"aa|af|av|ay|...|zh-cn|zh-sg|zu|..."}
        fontversion     Int      字体的版本号{401080}
        capability      String   字体的排版功能列表{"otlayout:hani"}
        embeddedbitmap  Bool     是否使用字体中内嵌的点阵字形
        embolden        Bool     字形渲染引擎(rasterizer)是否应该以合成的方式加粗[例如在偏移1像素的地方重绘一次,造成粗体的假象]
        fontfeatures    String   要开启的OpenType特性标记(feature tag)列表
        prgname         String   正在运行的程序的名称

        [提示1]有关 Int 类型的详细说明,可以参考下面对<const>单元的说明。
        [提示2]可以用 fc-query /path/to/foo.ttf 查看字体的属性

字体匹配

fontconfig 将接受到的字体样式(pattern)和系统中可用字体逐一对比,计算两者的距离,距离最小的字体被选中。这样确保任何情况下都能返回字体,但无法保证返回的字体与请求的字体吻合。

应用程序在请求匹配之前,会创建一个字体样式,其中包涵了所期望字体的所有属性,每个属性都可以包含按照优先级排列的多个值,越靠前,优先级越高,如果现有字体中的2个字体分别匹配上同一个属性的2个值,那么匹配较前的值得字体被认为距离更小。

整个匹配过程,应用程序传过来请求的字体样式会经过两次修改以及一次规范化,最后会返回字体样式给应用程序,返回的字体样式已经包涵足够的字体定位及渲染信息。

Fontconfig首先会按照配置文件(fonts.conf)的配置对应用程序传入的字体样式做第一次修改,包括test与edit(都在fonts.conf里面)2个步骤,首先用test指令进行匹配,然后再用edit进行修改, test和edit顺序是按照他们再配置文件出现的顺序依次执行。完成第一次修改后,fontconfig会对应用程序传过来的字体样式继续做规范化的默认替换操作,从而得到规范化属性(包涵全部要素),避免渲染程序为未指定的属性提供默认值。

经过第一次修改和规范化后,可以开始和系统中字体进行匹配了,通过以下几个属性进行匹配得到优先值

foundry, charset, family, lang, spacing, pixelsize, style, slant,weight, antialias, rasterizer and outline

这个列表具有优先级顺序。排前面优先级高。

其中这里面还有强弱绑定的区分,强弱绑定是通过第一次修改后给这些属性打的标签。

匹配完后的字体样式(按手册说其实是已经选定)再按照配置文件进行第二次修改。修改完后的字体样式信息返回给应用程序。

应用程序调试

加debug变量,可以打印出fontconfig的debug信息。

export FC_DEBUG=XXX

xxx为下列值:

         Name         Value    Meaning
         ---------------------------------------------------------
         MATCH            1    Brief information about font matching
         MATCHV           2    Extensive font matching information
         EDIT             4    Monitor match/test/edit execution
         FONTSET          8    Track loading of font information at startup
         CACHE           16    Watch cache files being written
         CACHEV          32    Extensive cache file writing information
         PARSE           64    (no longer in use)
         SCAN           128    Watch font files being scanned to build caches
         SCANV          256    Verbose font file scanning information
         MEMORY         512    Monitor fontconfig memory usage
         CONFIG        1024    Monitor which config files are loaded
         LANGSET       2048    Dump char sets used to construct lang values
         MATCH2        4096    Display font-matching transformation in patterns

比如:

deepin-reader print.pdf | more
FC_DEBUG=1
Match Pattern has 25 elts (size 32)
        family: "Noto Sans CJK SC"(s) "Noto Sans CJK SC"(s) "Noto Sans"(s)
        familylang: "zh-CN"(s) "en-us"(w)
        stylelang: "zh-CN"(s) "en-us"(w)
        fullnamelang: "zh-CN"(s) "en-us"(w)
        slant: 0(i)(s)
        weight: 80(i)(s)
        width: 100(i)(s)
        size: 13.44(f)(s)
        pixelsize: 14(f)(s)
        hintstyle: 1(i)(w)
        hinting: True(s)
        verticallayout: False(s)
        autohint: False(s)
        globaladvance: True(s)
        file: "/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc"(s)
        index: 2(i)(s)
        lang: "zh-CN"(w)
        fontversion: 2147483647(i)(s)
        embeddedbitmap: True(s)
        decorative: False(s)
        lcdfilter: 1(i)(w)
        namelang: "zh-CN"(s)
        prgname: "deepin-reader"(s)
        symbol: False(s)
        variable: False(s)

Best score 0 0 0 0 0 0 0 0 0 0 1e+99 0 0 0 0 0 0 0 0 0 0 0 0 0 2.14742e+12
Pattern has 24 elts (size 24)
        family: "Noto Sans CJK SC"(w) "Noto Sans CJK SC Regular"(w)
        familylang: "en"(w) "en"(w)
        style: "Regular"(w)
        stylelang: "en"(w)
        fullname: "Noto Sans CJK SC Regular"(w)
        fullnamelang: "en"(w)
        slant: 0(i)(w)
        weight: 80(f)(w)
        width: 100(f)(w)
        foundry: "GOOG"(w)

太多,日志没打完。

还可以

FC_DEBUG=8191 fc-match -s '宋体-15:lang=zh-cn' | more

慢慢看匹配过程

另外

fc-query STSONG-light.ttf 可以用来查询某个字体文件的样式 这信息比fc-list只列个字体名和style多多了。一般都二十几项。

fonts.conf 配置文件重点备忘

首先那些目录啥的就不说了。第一项重要的就是

 <match target="目标">
如果"目标"满足<test>列表的所有测试条件,那么将被按照<edit>列表中的指令序列进行修改。"目标"的默认值是"pattern",表示此<match>单元针对的是用于匹配的字体样式(第一次修改)。
如果"目标"的值是"font",那么就表示此<match>单元针对的是已被选定的字体(第二次修改)。
如果"目标"的值是"scan",那么就表示此<match>单元针对的是扫描字体以创建内部配置数据的初始化阶段(FcConfigParse)。

比如

<!--
  Accept deprecated 'mono' alias, replacing it with 'monospace'
-->
        <match target="pattern">
                <test qual="any" name="family">
                        <string>mono</string>
                </test>
                <edit name="family" mode="assign" binding="same">
                        <string>monospace</string>
                </edit>
        </match>

上面的target = pattern 表示第一次修改,目的就是将字体名mono换成monospace ,其实这两者都是等宽。名字换成固定的名字而已。

根据Linux字体美化实战的示例 中说配置文件初始阶段

<match target="scan">
	<test name="family"><string>Migu 1M</string></test>
	<edit name="family"><string>Monospace</string></edit>
	<edit name="lang"><langset><string>en</string></langset></edit>
	<edit name="charset">
		<charset>
			<!-- 基本拉丁(ASCII) -->
			<range><int>0x0020</int><int>0x007E</int></range>
			<!-- 此处省略了其他<range>与<int>单元,完整的配置请查看fonts.conf -->
		</charset>
	</edit>
</match>

这个配置的target 是scan ,表示对内部字体做初始化,因为一个字体可能支持比较多的字符集以及其他特性,这里可以将字体限制为用户想让字体展示的属性值。比如这里就只让他显示ASCII字符,虽然这个字体支持其他字符编码的字。这里也同时将Migu 1M 改名为通用的Monospace。

初始化设置完后,然后就是匹配了

<!-- 第一步,替换所有未安装的常见字体 -->
<alias binding="same"><family>mono</family><prefer><family>Monospace</family></prefer></alias>
<alias binding="same"><family>Candara</family><prefer><family>Sans</family></prefer></alias>
<alias binding="same"><family>文鼎PL中楷</family><prefer><family>Monospace</family><family>zhKai</family></prefer></alias>
<alias binding="same"><family>AR PL ZenKai Uni</family><prefer><family>Serif</family><family>zhKai</family></prefer></alias>
<!-- 这里省略了300多个其他类似的<alias>单元,完整的配置请查看fonts.conf -->

匹配第一步就是将常见的字体样式补齐,将系统中没有安装的字体使用类似的字体样式文件的字体去补充。这样遇到什么字体样式请求都总能有对应的字体。

然后就是一系列中文,西文等的补齐,比如

<match>
	<test name="family" qual="all" compare="not_eq"><string>Monospace</string></test>
	<test name="family" qual="all" compare="not_eq"><string>Sans</string></test>
	<test name="family" qual="all" compare="not_eq"><string>Serif</string></test>
	<edit name="family" mode="append_last"><string>Sans</string></edit>
</match>

上面的例子,先做测试,对于非等宽,非 无衬线,非衬线,就弱附加一个 无衬线 的字体样式名进去。这样补全以后,字体列表必然存在一个西文字体。

中英文补齐后,就能进行真正的匹配了。按照距离值,返回距离最小的字体。

字体里面要弄的太多了。还要继续学习很多。这只是系统fontconfig里面的配置文件和工具。

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门