Saber 酱的抱枕

Fly me to the moon

10/6
2024
软件

思源黑体的一些入门知识

思源黑体是一套著名的开源免费字体,并且现代 Windows 系统也已经内置了这套字体家族。当我不想使用微软雅黑时,通常都会优先考虑用它来代替。今天我使用时遇到了问题,于是花了些时间进行了一些了解。

思源黑体是一个开源项目,可以查看 它的 GitHub 主页

第一种含义:字体家族

思源黑体(Source Han Sans)这个词有多个含义。如果指的是它的整个概念,那么此时它包含多套字体。

这是因为思源黑体的家族里包含了多个语种的字体,有日语、简中、繁中、香港、韩语。而且根据粗细不同,又有细分。所以它里面其实有多个具体的字体。

比如这是它里面的一部分字体:

每个字体都有单独的名称,如 Source Han Sans SC ExtraLight

第二种含义:具体名称

如果你说“思源黑体”时,指的是叫这个名字的字体,那么它就只表示这套家族里的简体中文这一种字体(其实也包括了不同粗细度的细分字体)。

同理,如果 Source Han Sans 指的是叫这个名字的字体,那么它就只表示这套家族里的日语这一种字体。

为什么默认是日语?因为规范就是这样定的。

实际使用

如果我把某个地方的字体设置为 Source Han Sans,会如何?

因为此时指的是具体的字体名称,所以它应该会显示为日语的字形。

Chrome 的逻辑

但是也有一些软件的逻辑不一样,比如 Chrome 浏览器。当字体设置为 Source Han Sans 时,它会根据 html 标签的 lang 属性,自动显示对应语言的字体。例如本站的页面语言是简中 zh-cn,那么当字体设置为 Source Han Sans 时,它并不会显示日语,而是会显示简体中文。如果把页面语言改为繁中 zh-tw,就会显示繁体中文。

不仅如此,有时 Chrome 还会拒绝显示指定的字体。
当页面语言为简中时,就算我强制指定使用其他字体,如繁中字体:Source Han Sans TC,Chrome 也不会理会,它依然会显示为简体中文。
当页面语言为繁中时,如果我设置简中字体 思源黑体,那么也是无效的,Chrome 依然会显示繁体中文。

不过实际情况还会更复杂。
当页面语言为简中时,不管我设置该家族里的任何字体,Chrome 都只会显示简体中文这一种。
当页面语言为繁中时,除了繁体中文外,日语也可以生效。
当页面语言为日语时,简中、繁中、日语都可以显示。(至于会不会显示香港、韩语,我没详细测试)
当页面语言为英语时,我们设置什么它就显示什么。

这可能是 Chrome 考虑到不同语言的人们平常很少会使用某些特地语言,所以做了些优化措施。

指定字体名称

为了确保显示的字体符合预期,通常不应该使用较为笼统的 Source Han Sans,而是应该明确指定具体的字体名称。

主要方式就是在 Source Han Sans 后面添加特定的语言标志,不过这可不是乱加的,要跟字体的名称保持一致。

  • 简中 Source Han Sans SC
  • 繁中 Source Han Sans TC
  • 香港 Source Han Sans HC
  • 日语 Source Han Sans
  • 韩语 Source Han Sans K

另外也可以使用本地化名称,比如简中可以使用 思源黑体 指定,繁中可以使用 思源黑體 指定,香港可以使用 思源黑體 香港 指定。日语和韩语据我搜索看到底的,也有对应的本地化名称,但是在我的系统里没有。可见这种方式并不能保证在所有人的电脑上都有效,所以最好还是使用上面的英文缩写。

字体安装包的层级分类

思源黑体里面有多个具体的字体,不过它的字体文件并不一定是每个字体单独一份的。有时会把多种字体放在同一个字体文件里,便于一次安装多种字体。这也是有规范的。

在思源字体的 下载页面 里,可以看到一些目录,这就是不同的分类。

每个分类的含义在该页面的 readme 里有说明,我简单概括下。

SuperOTC

所有字体全部放在一个文件里,这是一个大而全的字体文件。Windows 里自带的思源黑体的字体文件就是这种。

OTC

按照粗细来区分的字体文件,里面的每个文件里都含有多个语言,并且每个语言只有一个字体,就是符合这种粗细的字体。示例:


截图里的字体是思源宋体,请不要在意这些细节

OTF

这是最细的分类,每种语言都单独分了一个文件夹,里面是不同粗细度的字体文件。

这里面的每个字体文件里只含有这一种字体。

SubsetOTF

它的分类和 OTF 一样是最细的,但文件夹使用的不是语言名字,而是国家/地区的代号。这些字体专注于当地使用的文字,不关心其他地区使用的文字。

前面的 SuperOTC、OTC、OTF 里的字体都是相同的,只是分类方式不同。但 SubsetOTF 里是不同的字体。

这些字体的名称:

  • 简中 Source Han Sans CN
  • 繁中 Source Han Sans TW
  • 香港 Source Han Sans HK
  • 日语 Source Han Sans JP
  • 韩语 Source Han Sans KR

SubsetOTF 里的字体的文字数量比前面的少。在 CN 分类的字体里,只包含了中国大陆的汉字写法,没有包含其他地区的汉字写法。比如说,有些汉字在日语里有独特的写法,但中国大陆的规范里没有这种写法,所以 CN 分类的字体里就不收录这些汉字。其他地区的字体文件也是同理。

SubsetOTF 存在隐患,如果使用场景不对,就有可能会出现缺字的情况,因为要输入/显示的文字在这个字体里可能不存在。

Variable

Variable fonts 是粗细度可变的字体(它们的字体名称里有 VF 字样)。

以往不同粗细的字体都是单独设计的,例如:

每款字体的粗细度都是固定的,用户使用时无法调整。而可变字体的粗细度没有固定,用户可以在使用场景里自行调整粗细。

CSS 有个属性 font-weight 可以调整字体粗细,但以往你会发现只有少数几个值有用,这是因为字体只预设了这几种粗细度。使用可变字体的话,粗细度就真的可以自由设定了。

Windows 里的思源黑体

Windows 11 系统默认安装了全套思源黑体,其对应的字体文件是 C:\Windows\Fonts\SourceHanSans.ttc。它就是一个大合集(SuperOTC 分类的字体),包含了所有语种和所有粗细的字体(但是不包含只针对特定地区的 SubsetOTF 字体)。

打开它进行预览,是这样的:

可以注意到,标题栏里显示了复数个字体名称。点击右上角的“下一页”按钮可以查看里面的每一个字体。

可以看到,这里面的 Source Han Sans 字体(后面没有语言代号)就是日语的字形。

不同字体里的字形不同

有些字在简中和日语里是有区别的,比如“葫芦娃”的“芦”:


第一张图片里是简中,第二张图片里是日语。

再来一组对比图,从上到下依次是简中、繁中、日语。



它们是同样的字(我输入的是简中的字),只是在不同字体里显示的不一样。

需要注意:有些字在不同字体里确实是不同的字,比如很多繁体字。我输入的简体字并不会因为我把字体改为繁体,就自动变成繁体(除非有的字体特意这么做)。

思源宋体

前面讲的都是思源黑体 Source Han Sans,其实还有个思源宋体 Source Han Serif,也是开源的:

https://github.com/adobe-fonts/source-han-serif

最大的区别就是黑体是无衬线字体,宋体是有衬线字体。

Windows 没有内置思源宋体,看来它的使用率没有思源黑体高。

思源黑体的一些入门知识