AlibabaPuHuiTi-3-55-RegularL3.otf是sans-serif体,证明如下:
fc-match -s sans-serif:lang=zh | grep Alibaba
AlibabaPuHuiTi-3-55-RegularL3.otf: "Alibaba PuHuiTi 3.0" "55 Regular L3"
AlibabaPuHuiTi-3-55-RegularL3.otf也是serif体,证明如下:
fc-match -s serif:lang=zh | grep Alibaba
AlibabaPuHuiTi-3-55-Regular.otf: "Alibaba PuHuiTi 3.0" "55 Regular"
AlibabaPuHuiTi-3-55-RegularL3.otf: "Alibaba PuHuiTi 3.0" "55 Regular L3"
我就头大了,一个字体----AlibabaPuHuiTi-3-55-RegularL3.otf,可以同时具有serif和sans-serif,这两个不相容的性质吗?
没问题啊,只是你“认为”它们是不相容的,可在计算机看来他们都是字体,为什么只能用你不能用我?
而且字体本身并没有衬线、非衬线属性,这些是人为为了排版需求加的分组而已。
如果你学过前端,应该记得声明字体的最佳实践是英文字体在前而中文字体在后,想想看为什么?就明白计算机选择字体的逻辑了。
通常来说声明字体都是“分组”,而不是使用某一种具象化的字体,因为假如没有这种字体难道还不允许用户替代别的字体了?
比如声明中文字体、英文字体等等。中文字体本身也提供英文,难道中文字体不能渲染英文吗?这样你还认为他们是“不相容”的吗?
以你的场景为例,你想要使用“衬线字体”,或“非衬线字体”,这是一种分类而已,好比是你说“我要使用中文字体”,“我要使用英文字体”一样,并没有具体的某个字体名叫sans-serif
或serif
,对吧?那么他们在计算器看来就相当于某个分类字体,意味着叫sans-serif
有一组候选字体,计算机从中挑选任意一个字体拿来用,这样理解没问题吧?再者说,难道衬线字体不能渲染非衬线字体吗?
那么所有的字体都可能是这个分组下的字体,都可以进入候选名单,因此你要做的就是控制优先级,符合分组条件的字体靠前,不符合条件的靠后,仅此而已。
fc-match -s
是按照优先级列出匹配的字体,你只需要管你期望的字体是不是靠前就行了。比如你期望英文字体靠前,中文字体紧随其后,这样对于英文和中文都有不错的渲染效果。你要支持emoji,可能期望emoji字体更靠前,仅此而已。
EDIT: 即使你期望使用某个具体的字体,你也会发现几乎所有的字体都在候选列表中:
$ fc-list | grep 微软雅黑
/home/fengyu/.local/share/fonts/msyhl.ttc: 微软雅黑,Microsoft YaHei,Microsoft YaHei Light,微软雅黑 Light:style=Light,Regular
/home/fengyu/.local/share/fonts/msyh.ttc: 微软雅黑,Microsoft YaHei:style=Regular,Normal,obyčejné,Standard,Κανονικά,Normaali,Normál,Normale,Standaard,Normalny,Обычный,Normálne,Navadno,Arrunta
/home/fengyu/.local/share/fonts/msyhbd.ttc: 微软雅黑,Microsoft YaHei:style=Bold,Negreta,tučné,fed,Fett,Έντονα,Negrita,Lihavoitu,Gras,Félkövér,Grassetto,Vet,Halvfet,Pogrubiony,Negrito,Полужирный,Fet,Kalın,Krepko,Lodia
$ fc-match -s 微软雅黑
msyh.ttc: "微软雅黑" "Regular"
msyhl.ttc: "微软雅黑" "Light"
SourceHanSans.ttc: "思源黑体" "Regular"
NotoSans-Regular.ttf: "Noto Sans" "Regular"
NotoSans-Italic.ttf: "Noto Sans" "Italic"
DejaVuSans.ttf: "DejaVu Sans" "Book"
DejaVuSans-Bold.ttf: "DejaVu Sans" "Bold"
DejaVuSans-Oblique.ttf: "DejaVu Sans" "Oblique"
DejaVuSans-BoldOblique.ttf: "DejaVu Sans" "Bold Oblique"
verdana.ttf: "Verdana" "Regular"
arial.ttf: "Arial" "Regular"
NimbusSans-Regular.otf: "Nimbus Sans" "Regular"
l_10646.ttf: "Lucida Sans Unicode" "Regular"
tahoma.ttf: "Tahoma" "Regular"
NotoColorEmoji.ttf: "Noto Color Emoji" "Regular"
micross.ttf: "Microsoft Sans Serif" "Regular"
cour.ttf: "Courier New" "Regular"
mvboli.ttf: "MV Boli" "Regular"
# ....
但是注意优先级
在字体系统中,一个字体通常不会被直接标记为同时属于serif(衬线)和sans-serif(无衬线)类别,因为这两个类别是互斥的,定义了字体的基本视觉特征。然而,你所遇到的情况可能源于几个不同的因素:
AlibabaPuHuiTi-3-55-RegularL3.otf
和 AlibabaPuHuiTi-3-55-Regular.otf
(注意文件名中的微小差异)都被列为了serif和sans-serif的匹配结果。这可能是因为这两个文件名虽然相似,但实际上指向了不同风格的字体文件,或者在某些情况下,字体文件本身可能具有双重分类(尽管这是不常见的)。fc-match
命令使用fontconfig库来匹配字体。fontconfig的配置文件(如fonts.conf
、fonts.dir
等)可能包含了特定的规则,这些规则决定了如何分类和匹配字体。如果配置文件中存在冲突或不一致的规则,就可能导致类似你所观察到的现象。为了解决这个问题,你可以尝试以下几个步骤:
通常,一个字体不会同时被分类为serif和sans-serif。你所遇到的情况可能是由字体命名、配置错误或字体本身的特性导致的。通过检查这些方面,你应该能够找到问题的根源并解决它。
我试图在我的一个布局中使用roboto精简字体,但当我将字体系列设置为“sans serif thin”时,默认情况下字体为斜体,我无法强制其正常。 谁能告诉我在布局中使用机器人瘦普通字体的正确方法?
Noto的SC字体有serif,sans serif的正式称呼。 列出系统所有的Sans: 列出系统所有的serif: 我们看看阿里巴巴的普惠字体。 字体很多。 以serif、sans serif来区分,阿里巴巴普惠体究竟是什么体?
vscode 注释字体可以缩小么? 也就是比代码的小一号。 像 idea一样。
如何编写由字符组成但必须以相同字母开头和结尾的正则表达式?例如:
在我的应用程序中,我有一个文本视图,用户可以在其中设置字体和字体样式。我正在用这行排字。 现在,我使用以下行设置字体样式: 这很好用。我可以看到字体已改为衬线斜体。问题是,当我将字体样式改为普通字体时,字体就变松了。 上面的一行不仅将斜体重置为普通,还将衬线重置为默认字体。 如何保留以前的字体,并将字体样式更改为普通字体? 我正在使用API:min sdk版本=17,目标版本=21
问题内容: 我正在寻找@ font-face CSS规则的MDC页面,但我一无所获。我分别使用粗体 , 斜体 和 粗体+斜体文件 。如何将所有三个文件嵌入一条规则?例如,如果我有: 浏览器将不知道用于粗体显示的字体(因为该文件是DejaVuSansBold.ttf),因此它将默认为我可能不想要的字体。我如何才能告诉浏览器某种字体的所有不同变体? 问题答案: 解决方案似乎是添加多个规则,例如: 顺便