前阵子把主力工作机上的正文字体换成了 BIZ UDGothic,用了大概一个多月,最直观的感受是晚上看文档时眼睛没那么快发酸。这款由行业组织联合老牌字库推出的免费开源字体,属于 UD(Universal Design,通用设计)字体系列,主打的就是「小字号下依然认得出、看得清」。它有黑体(BIZ UDGothic)和明朝体(BIZ UDMincho)两条线,授权是 SIL Open Font License 1.1,商用、嵌入、二次分发都不需要付费。这篇文章想聊的不是「又一个免费字体推荐」,而是我把它从下载、装进系统、配到网页、再到实际排版调参的这一整条链路上踩到的坑和摸出来的经验:它到底适合谁、不适合谁、装完为什么没生效、网页里怎么接才不会闪、中文混排为什么会冒出方块。内容对刚接触字体配置的新手够友好,对有前端或排版经验的读者也能直接抄走参数和代码。
1. 为什么我会盯上 BIZ UDGothic 这款字体
1.1 UD 设计到底解决了什么实际问题
先说清楚「UD」这两个字母的含义,不然很容易把它当成又一个营销词。UD 是通用设计,落到字体上,核心目标只有一个:让尽可能多的人在尽可能差的条件下也能读清楚。所谓「差的条件」,包括老花眼、散光、屏幕分辨率低、字号被压到 12px、显示器反光、长时间阅读导致的对焦疲劳。这些场景在办公文档、说明书、公共交通标识、教科书里特别常见,所以这类字体最早就是为教育材料和公共信息场景做的。
BIZ UDGothic 在具体设计上有几个能直接感知到的特征。第一是字形区分度,最容易混淆的那几组字符——数字 0 和大写 O、数字 1 和小写 l 和大写 I、大写 U 和小写 v——都做了明确的差异化处理,0 带内部标记,1 有起笔的斜挑,不会出现「密码里到底是 1 还是 l」这种要命的问题。第二是字面率更大,同样字号下,单个字的实际占位更满,笔画之间的空隙更均匀。第三是重心和笔画粗细经过重新配平,横竖笔画的粗细差被压缩,小字号渲染时不会出现横画糊成一片的情况。我拿它和几款常见黑体在 12px、13px 下做过对照,BIZ UDGothic 的笔画边缘在低分辨率下确实更「站得住」,尤其是「日月目」这类多横画的字,横画之间还能拉出可辨识的缝隙。
这里要解释一下为什么这类设计在小字号下收益特别明显。屏幕渲染汉字时,一个 12px 的字,横向只有 12 个像素可用,一个「量」字里面有七八条横画,平均下来每条横画只能分到 1 个像素甚至分不到。如果原始字形设计时笔画粗细是 1:2 或 1:3 的对比,那么细的那部分在像素栅格化过程中就会被直接「吞掉」,变成一片灰糊。UD 字体压缩笔画对比度,本质上是在给像素渲染留余量。这也是为什么我用它替换掉原来的默认字体后,同样的界面字号下,阅读速度主观上变快了。
1.2 先把丑话说在前面:它不是中文字体
这是我必须先泼的一盆冷水,也是我踩得最深的一个坑。BIZ UDGothic 是日文字体,字符集覆盖的是日文的假名、JIS 标准的第 1 水准和第 2 水准汉字,加上一批历史遗留的扩展字符,总量在七千字符量级。它能显示绝大多数在日文语境里出现的汉字,但不包含简体中文特有的字形和字符。
具体会出什么问题?最典型的是「这」「门」「们」「过」「还」「说」这类简化字,在日文字符集里根本不存在对应编码,系统会回退到你字体栈里的下一个字体去渲染。结果就是一页中文里,大部分字是 BIZ UDGothic 的样子,零星几个字突然换成了微软雅黑或思源黑体的样子,字重、字面大小、基线全对不上,视觉上像打了一堆补丁。更隐蔽的问题是同形异码:像「直」「骨」「今」「令」「化」「别」这些字,简体中文和日文都有对应编码,但写法不一样。「直」字下面那一横,日文写法是连着的还是分开的,细节上跟简体中文标准不同;「骨」字上半部分的朝向两边也不一样。这类差异不会报错,但中日混排的页面上,同一个字在不同段落长得不一样,非常扎眼。
所以我的结论很明确:如果你的内容主体是简体中文,别把它当正文字体用。它真正合适的位置有三个。一是日文内容为主的界面或文档,这是它的主场。二是中文页面里的数字、拉丁字母、全角标点、假名这些局部字符,可以用 unicode-range 分包让它只负责这些码位。三是纯技术场景,比如代码注释、日志查看器、终端输出——这些地方大量字符是 ASCII,汉字的可读性要求没那么高,UD 字体的清晰度优势反而凸显。我现在的做法是:主文档正文用一款中文字体,BIZ UDGothic 只挂在日文段落和数字表格上,靠 CSS 的字体栈和 unicode-range 精确控制,不让它越界。
2. 下载环节:三个渠道与一次必要的手动校验
2.1 渠道对比与选择
拿到这款字体文件有三条路,我三个都走过,各自适合不同的人。
| 渠道 | 拿到的东西 | 优点 | 需要注意 |
|---|---|---|---|
| 官方字体库平台 | 单个字重的 TTF,通常已做基础优化 | 下载即用,不需要处理压缩包,页面能看到字符集预览 | 只提供官方发布的字重,没有历史版本可选 |
| 开源代码托管平台的发布页 | 完整压缩包,含 OTF/TTF、授权文件、更新日志 | 版本最全,能翻到旧版本,授权文件齐全 | 文件体积大,需要自己解压筛选,发布页面偶尔会混入测试版 |
| 发行版软件源 | 打包好的字体包 | 一条命令装完,自动处理字体缓存 | 版本可能落后,包名不一定直观,不好找 |
日常使用我推荐走官方字体库平台,理由是省事且不会下错版本。要做二次开发、子集化、或者需要严格的版本锁定(比如设计团队统一字体版本),就走代码托管平台的发布页。发行版源适合服务器和容器环境,批量部署的时候用得上。
下载时有个细节容易被忽略:同一款字体在不同渠道的字体家族名可能不一样。官方发布的版本家族名一般是拉丁名「BIZ UDGothic」,但有些打包版本会在元数据里同时写入日文名「BIZ UDゴシック」。这会导致你在系统的字体列表里搜「UDGothic」搜不到,得换日文名再搜一次。我第一次装的时候就卡在这儿,一度以为装失败了,其实是名字对不上。装上之后建议直接在字体管理界面里按字母顺序翻一遍,确认家族名到底叫什么,后面写 CSS 或者配编辑器的时候要用准确的名字。
2.2 校验授权与文件完整性
开源字体不等于随便用,花两分钟看一眼授权文件是值得的。BIZ 系列采用的是 SIL Open Font License 1.1,这个协议的核心条款是:可以自由使用、复制、合并、修改、分发,包括商用和嵌入到软件或文档里;但不能单独售卖字体文件本身;修改后的衍生版本如果授权文件里声明了「保留字体名」(Reserved Font Name),就必须改名之后再发布,不能继续叫 BIZ UDGothic。我自己做过一次子集化,把字符裁到只剩假名和常用符号,这种情况下就必须在 CSS 里换个自定义的 family 名,否则属于违规。这一步很多人不知道,容易埋雷。
文件完整性方面,拿到文件后建议做两件事。第一,确认压缩包里同时有字体文件和OFL.txt之类的授权文本,缺授权文件的来源不要用。第二,装之前先在字体查看器里打开看一眼字符集数量和字形预览,确认能正常渲染假名和常用汉字。有些第三方镜像站会把字体文件重新压缩甚至转格式,遇到过 OTF 转 TTF 之后 hinting 信息丢失、小字号发虚的情况。文件体积上,单个字重的 TTF/OTF 在数 MB 量级,woff2 压缩后大约是原体积的三到四成,如果下载到的文件只有几百 KB,基本可以判定是被裁剪过的子集版本,用在完整页面上会大量缺字。
3. 三个平台的安装实操
3.1 Windows:用户级与系统级的区别要搞清楚
Windows 上装字体最直接的方式是右键字体文件,选「安装」。但这里有个坑:右键默认的「安装」是装到当前用户,只有这一个账户能用;如果你是多账户共用一台机器,或者某些以服务身份运行的软件(部分老版本的设计软件、打印服务)需要读系统字体目录,就得选「为所有用户安装」。这个选项在右键菜单里叫「安装(为所有用户)」,需要管理员权限。
批量安装的时候右键点几十次太蠢,用 PowerShell 一条命令解决:
# 用户级安装(无需管理员权限) $dest = "$env:LOCALAPPDATA\Microsoft\Windows\Fonts" New-Item -ItemType Directory -Force -Path $dest | Out-Null Copy-Item ".\BIZ-UDGothic\*.ttf" -Destination $dest # 系统级安装(需以管理员身份运行) $dest = "$env:WINDIR\Fonts" Copy-Item ".\BIZ-UDGothic\*.ttf" -Destination $dest要注意,单纯把文件拷进字体目录,系统不一定会识别。用户级目录拷贝后通常需要注销重登或者重启资源管理器才生效;系统级目录拷贝后最好在注册表里补一条记录,或者干脆用 Shell 的字体安装接口。稳妥做法是拷完之后打开「设置 > 个性化 > 字体」看一下列表里有没有出现,没出现就注销一次。我图省事直接拷贝过一次,结果在 Office 里死活找不到这个字体,折腾了半小时才发现是没刷新字体缓存。
装完之后还有一步验证:随便开个文本编辑器,输入几个容易混淆的字符组合,比如Il1 O0,把字体切到 BIZ UDGothic,看这几个字符是不是有明显的形态差异。如果看不出差异,说明字体根本没生效,大概率是家族名没选对,选成了别的字体。
3.2 macOS:字体册的双击与批量导入
macOS 上双击字体文件会打开「字体册」(Font Book),点「安装字体」即可。默认安装位置是当前用户的字体库,只有本账户可用;想给所有账户用,需要在字体册的偏好设置里把「默认安装位置」改成「电脑」,或者安装时手动选择。批量导入的话,直接把整个文件夹拖到字体册窗口里,它会一次性处理所有字体文件,遇到重名会弹窗问你是替换还是保留两份。
macOS 上有个特别需要注意的点:字体册会做一次自动验证,如果字体文件的元数据有格式问题,它会标成「已损坏」或者「需要修复」,然后拒绝安装。开源字体偶尔会出现这种情况,尤其是自己子集化过的文件。遇到这种提示不要急着删,先在字体册里选中该字体,右键「验证」,看具体报的是什么问题。多数情况下是 naming table 里的某些字段不规范,不影响实际渲染,可以用命令行工具跳过验证直接装:
# 拷贝到用户字体目录,绕过字体册验证 mkdir -p ~/Library/Fonts cp ./BIZ-UDGothic/*.ttf ~/Library/Fonts/拷完之后重启一下正在用的应用。macOS 上的应用对字体列表的读取有缓存,尤其是 Adobe 系的软件,不重启就看不到新装的字体,这一点跟 Windows 一样。
3.3 Linux:手动放目录与缓存重建
Linux 上装字体的核心是「放对目录 + 重建缓存」,两步缺一不可。
# 用户级:只对当前用户生效,不需要 root mkdir -p ~/.local/share/fonts/biz-udgothic cp ./BIZ-UDGothic/*.ttf ~/.local/share/fonts/biz-udgothic/ # 系统级:所有用户可用,需要 root sudo mkdir -p /usr/share/fonts/truetype/biz-udgothic sudo cp ./BIZ-UDGothic/*.ttf /usr/share/fonts/truetype/biz-udgothic/ # 重建字体缓存(关键步骤,漏了前面白做) fc-cache -fv # 验证是否被识别 fc-list | grep -i "biz"fc-cache -fv里的-f是强制重建,-v是输出详细过程,能看到它扫到了几个字体文件。如果fc-list里搜不到,按这个顺序排查:文件权限是不是 644(权限不对 fontconfig 会跳过)、目录层级是不是太深、文件名有没有奇怪字符、缓存目录~/.cache/fontconfig是不是写满了或者损坏(损坏的话删掉整个目录再重建一次)。
用包管理器装的话更省事,apt系一般是fonts-biz-udgothic之类的包名,dnf或pacman系的包名略有不同,装完会自动跑fc-cache。但包管理器装的版本往往落后一两个版本,要做字体子集化或者跟前端保持版本一致的话,还是手动装更可控。容器镜像里用的话,记得在 Dockerfile 里把fc-cache -fv也写进去,不然镜像里的字体缓存是空的,字体等于没装。
4. 网页端接入:从 @font-face 到加载策略
4.1 字体栈与回退顺序:中日混排的关键
网页里接这款字体,最容易出问题的不是加载,而是回退顺序。浏览器的字体匹配是逐字符进行的:它拿一个字符去字体栈里第一个字体找,找到了就用,找不到才往下一个走。所以栈的顺序直接决定了哪些字符用哪款字体渲染。
有两种典型场景,顺序完全相反:
场景 A:页面主体是日文。这时候 BIZ UDGothic 应该放在最前面,让它接管包括汉字在内的绝大部分字符,后面的中文字体只作为缺字兜底。
:root { --font-ja-body: "BIZ UDGothic", "Hiragino Sans", "Yu Gothic", "Source Han Sans SC", "Noto Sans SC", sans-serif; }场景 B:页面主体是简体中文,只有局部含日文。这时候不能把 BIZ UDGothic 放第一位,否则中文正文里那些同形异码的汉字(直、骨、今、令)全都会按日文字形渲染,中文读者看着别扭,专业排版里这属于明确的错误。正确做法是用unicode-range把它限制在假名和全角标点区间,让它只干这些活:
/* 只接管假名、全角标点、全角字母数字 */ @font-face { font-family: "BIZ UDGothic Kana"; src: url("./fonts/biz-udgothic-kana.woff2") format("woff2"); font-weight: 400; font-style: normal; font-display: swap; unicode-range: U+3000-303F, U+3040-309F, U+30A0-30FF, U+FF00-FFEF; } :root { --font-zh-body: "Source Han Sans SC", "PingFang SC", "Microsoft YaHei", "BIZ UDGothic Kana", sans-serif; }这里的unicode-range是按码位段声明的:U+3000-303F是中日韩标点,U+3040-309F是平假名,U+30A0-30FF是片假名,U+FF00-FFEF是全角字母数字和半角片假名。声明之后,浏览器只会用这个字体文件渲染落在这些区间里的字符,其他字符一律跳过它走下一个字体。这样一来,假名用的是 UD 字体的清晰字形,汉字用的是中文字体的标准字形,两边各司其职,不会打架。
要生成这个只含假名的子集文件,用 fonttools 的pyftsubset,一条命令搞定:
pip install fonttools brotli pyftsubset biz-udgothic-regular.ttf \ --unicodes="U+3000-303F,U+3040-309F,U+30A0-30FF,U+FF00-FFEF" \ --layout-features="*" \ --flavor=woff2 \ --output-file=biz-udgothic-kana.woff2--flavor=woff2需要 brotli 支持,所以要一并装上。裁完之后文件体积能从数 MB 掉到几十 KB,加载成本几乎可以忽略。注意:子集化之后字体名变了(元数据里的授权条款要求衍生版本改名),所以 CSS 里必须用自定义的font-family名,不能继续沿用原名字,这一点前面提过,属于授权协议要求,不是可选项。
4.2 加载策略与体积控制:别让字体把首屏拖慢
字体文件和图片一样,加载是「发现即阻塞」的。如果没有做任何处理,浏览器在解析到 CSS 里的@font-face时会发起下载,并且在字体下载完成之前,使用该字体的文本可能一直不显示(这段空白期叫 FOIT),用户看到的是半页空白。三个手段可以解决。
第一是font-display。给@font-face加font-display: swap,浏览器会先用系统字体渲染文本(这段叫 FOUT,文本先显示但字体是错的),等自定义字体下载完再换过来。对正文内容来说这个策略最友好,因为用户至少能立刻读到字。有一点副作用:字体切换的瞬间会有一次视觉跳动,页面文字整体重排一下。字体和回退字体的字面率差异越大,跳动越明显——BIZ UDGothic 的字面率偏大,跟很多系统默认字体差异不小,所以行高和字距最好在两边都测一遍,别只调好一边。
第二是预加载关键字体。对首屏必须用到的那一个字重,用<link rel="preload">提前拉:
<link rel="preload" href="./fonts/biz-udgothic-kana.woff2" as="font" type="font/woff2" crossorigin="anonymous">crossorigin这个属性不能省,字体请求属于跨源请求,即便是同域名下,缺了它浏览器会发两次请求,等于白预加载。
第三是控制字重数量。BIZ UDGothic 官方就两个字重(Regular 400 和 Bold 700),这反而是好事,不用纠结要加载几个。我的建议是:正文只加载 400,700 按需。如果页面上粗体出现频率低(比如只有标题用),完全可以用中文字体的粗体去替代,或者在 CSS 里干脆不声明 700 的@font-face,让浏览器去合成伪粗体——虽然合成粗体的效果不如原生,但对假名这种简单笔画来说差异不大,能省一次几 MB 的请求。
还有一点是关于local()的取舍。有些教程会教你在src里先写local("BIZ UDGothic"),优先读用户本地已装的字体,读不到再下载。听起来很美好,实际有坑:用户本地装的版本可能跟你预期的不一样,甚至可能是修改过的衍生版本,字形对不上;而且local()命中与否的行为在不同浏览器上不完全一致。我现在的做法是不写local(),直接走网络请求,版本统一、行为可预测。字体文件做子集化之后也就几十 KB,省这点流量不值当冒版本不一致的风险。
5. 排版参数调优:让 UD 字体真正「耐读」
5.1 字号、行高、字距的取值逻辑
字体选对了,参数调不对照样累眼睛。UD 字体的特点决定了它的参数跟普通黑体不太一样,我拿它调了几天,整理出下面这套取值,直接可以拿来用。
| 参数 | 建议范围 | 我的取值 | 理由 |
|---|---|---|---|
| 正文字号 | 15px - 17px | 16px | 字面率大,14px 以下优势发挥不出来,17px 以上行宽会变小 |
| 行高 | 1.7 - 1.9 | 1.8 | 字面大意味着行间留白被压缩,行高要往上加 |
| 字距 | 0 - 0.03em | 0.01em | 假名本身设计紧凑,中文混排时可微调 |
| 段间距 | 0.8 - 1.2 倍行高 | 1em | 视觉上比空一行更紧凑 |
| 单行字数 | 30 - 40 字 | 34 字 | 超过 40 字回扫成本高 |
行高为什么必须往上加,这里解释一下:行高的本质是「字号 × 倍数」,但它衡量的不是字的外框,而是字的字符框。UD 字体为了在小字号下更清晰,会把字形做得更大、更满,字符框内的有效墨迹比例更高。也就是说,同样的line-height: 1.5,普通字体看起来行间还有呼吸感,BIZ UDGothic 就已经贴得很紧了。我实测下来,1.5 的行高在 16px 字号下,相邻两行的汉字几乎要碰到,看着非常压抑;加到 1.8 才回到舒服的状态。
字距的调整要看内容类型。纯日文内容,尤其是含大量假名的,一般不需要加字距,假名本身在原始设计里就有足够的侧边空白。中日混排的时候,中文字符会被当成全角处理,跟假名挤在一起,视觉密度会偏高,加个letter-spacing: 0.01em到0.02em能缓和一下。但别超过 0.05em,加多了会破坏中文的词内连贯性,读起来一顿一顿的。
还有一个容易忽略的参数是标点的挤压。中文排版里有「标点挤压」的概念,行首的逗号句号要缩进、行尾的标点要留白。日文字体自带的标点设计通常已经包含了日式的处理(比如「、」「。」在字符框里的位置偏左下),直接搬到中文版面里会显得位置怪。如果你的页面中文占主导,建议给标点单独指定中文字体,别让日文字体接管全角标点:
.punct-fix { font-family: "Source Han Sans SC", sans-serif; /* 覆盖掉 BIZ UDGothic 的假名/标点分包 */ }这属于比较细的排版活儿,做不做看内容要求。技术文档可以不管,正式出版物或者对外品牌页面就得抠一抠。
5.2 编辑器与终端里的坑:它不是等宽字体
这一节是专门写给程序员的,因为我一开始就把它当终端字体用了,结果一头撞在墙上。
BIZ UDGothic 不是等宽字体。它的日文部分是全角,宽度统一,但 ASCII 部分是比例宽度——字母 i 和 w 占的宽度不一样,数字还算规整,标点符号宽窄不一。放到终端里,llll和wwww显示出来的长度完全不同,表格对不齐,代码缩进全乱,日志里的列完全错位。我用了十分钟就换掉了。
那为什么还有人推荐它做编程字体?因为在特定场景下它可以用。比如:
- 纯使用全角字符的界面(某些日文终端应用)
- 只看不排版的日志流,不强求列对齐
- 作为备选字体,跟等宽字体配合:等宽字体负责 ASCII,BIZ UDGothic 负责中文和日文,靠字体栈实现「ASCII 等宽 + 全角清晰」
第三种是我现在实际在用的方案,配置在 VS Code 里是这样:
{ "editor.fontFamily": "'JetBrains Mono', 'BIZ UDGothic', monospace", "editor.fontSize": 15, "editor.lineHeight": 1.7, "terminal.integrated.fontFamily": "'JetBrains Mono', 'BIZ UDGothic', monospace", "terminal.integrated.fontSize": 14 }这里等宽字体在前,负责所有 ASCII,BIZ UDGothic 排在后面只接住等宽字体里没有的字符——中文字符和假名。这样中文注释的清晰度上来了,代码对齐也没坏。前提是等宽字体的中文字形不能太丑,不然中文部分还是先被前面的字体接管了,BIZ UDGothic 根本没机会出场。判断方法很简单:把字体栈里的第一个字体单独拿出来看它的中文字形,如果它能显示中文,那你的第二选择永远用不上。
顺带提一个 VS Code 里的细节:editor.lineHeight设成倍数时,中文行和英文行的实际间距会不一样,因为行高是按字号算的,而中西文的字符框高度不同。设 1.7 到 1.8 是比较稳的区间,再高屏幕能显示的行数就太少了。
6. 常见问题与排查速查
6.1 典型故障现象与定位路径
下面这张表是我和同事这一两个月里实际撞到的问题,按现象、可能原因、验证方法、解决动作整理。遇到问题先别急着重装,按「验证方法」那一列走一遍,九成情况能定位。
| 现象 | 可能原因 | 验证方法 | 解决动作 |
|---|---|---|---|
| 系统字体列表里搜不到 | 家族名是日文名,或缓存未刷新 | 按字母序翻一遍列表,或用fc-list查 | 换日文名搜索;重启应用或注销重登 |
| 装完应用里看不到 | 应用有字体缓存 | 重启该应用 | 关掉全部进程重开,必要时重启系统 |
| 网页里中文出现方块 | 字体文件是裁剪版子集 | 在字体查看器里数一下字符数 | 换完整版文件,或补齐回退字体 |
| 平时正常,某些字突然变样 | 中日同形异码,被日文字体接管 | 对比该字在中日字体下的写法 | 调整字体栈顺序,或加 unicode-range |
| 粗体看起来很糊 | 没装 700 字重,浏览器合成伪粗体 | 查document.fonts里加载了几个字重 | 补声明 700 的@font-face,或换真实粗体 |
| 首屏一片空白后突然出现 | FOIT,字体阻塞渲染 | 看 Network 里字体请求的时序 | 加font-display: swap+ preload |
| 字重切换时页面跳动 | 回退字体和自定义字面率差异大 | 屏蔽字体后再看一遍布局 | 按自定义字体的度量重新调行高字距 |
| Linux 下字体装了但不生效 | 文件权限不对或缓存损坏 | fc-list | grep biz查不到 | chmod 644后删缓存目录重建 |
举一个我印象最深的排查过程。当时一个页面上,中文正文里每隔几十个字就冒出一个「怪字」,字形明显跟周围的字不一样,但又不是方块。我一开始以为是字体栈写错了,检查了半天 CSS 没发现问题。后来把那段文字单独拉出来,用字符编码工具逐字查码位,才发现那个字在日文字符集里有对应的编码,所以被 BIZ UDGothic 接管了,而它的日文字形跟简体中文写法有细微差别。这就是前面说的「同形异码」,不会报错、不会缺字,纯粹是字形不一致。解决办法就是把它从字体栈的第一位挪走,用unicode-range把它限制在假名区间。这类问题只能靠逐字比对码位来找,肉眼很容易看漏,所以我现在遇到「某个字看着不对劲」的情况,第一步就是把它的码位打出来看一眼。
6.2 我的避坑清单
几条用血换来的经验,按重要性排序。
第一条,下载后先验字符集,再谈美观。很多人拿到字体第一件事是打开看字形好不好看,但真正会毁掉整个项目的是字符集不够。装之前用字体查看器确认字符数量级对不对,跑一遍你实际会用到的文字样本(尤其是中文简体里的常用字),看有没有缺。这一步花五分钟,能省掉后面改稿的几小时。
第二条,子集化之后一定要改名。授权协议里对衍生版本有改名要求,这不是形式主义。而且从工程角度看,同一个 family 名下挂了两个字符集不同的文件,浏览器和系统会混乱,缓存也可能串。子集版本用独立名字(比如加个Kana后缀),职责清晰。
第三条,字体栈里别放超过四个字体。每多一个字体,缺字时的查找链路就多一跳,而且每一跳都可能引入新的字形不一致。我一般控制在三个:首选、中文兜底、通用兜底。真的需要按码位精细控制,用unicode-range分包,别靠堆栈解决。
第四条,改字体的同时一定要重新看一遍行高。字面率不同的字体,同样的line-height观感差异很大。换字体不改行高,是排版翻车最常见的原因,没有之一。我现在的习惯是:换字体之后先把行高从 1.5 一路调到 2.0,每 0.1 看一遍,找到视觉上最松而不散的那个点,再微调字号。
第五条,不同环境要用不同版本。桌面安装用 TTF 或 OTF 都行,Windows 对 TTF 的支持更稳一些;网页端必须用 woff2,并且做子集;Linux 服务器上如果只是给工具链用(比如生成 PDF、图片渲染),装完整版就行,不用子集。别指望一个文件通吃所有场景,那样每个场景都会将就。
第六条,字体文件的版本要跟团队对齐。这一条是协作场景里的隐痛。同一个页面,设计师本地装的是旧版本,前端用的是新版本,两边截图对比字形有细微差别,然后开始互相甩锅。稳妥的做法是把字体文件放进代码仓库(子集化的 woff2 也就几十 KB,完全可以进版本控制),前端统一引用仓库里的文件,桌面端约定版本号。字体这种「看起来不会变」的资源,恰恰是最容易在协作里出问题的。
用了一个多月,我对这款字体的定位越来越清楚:它是一个特定场景下的最优解,而不是通用解。日文内容、数据密集的表格、需要小字号清晰度的界面,它表现非常好;简体中文的正文排版,它不该上场。想清楚这一点,前面的下载、安装、配置这些步骤才有意义。最后再分享一个小技巧:调参的时候别在浅色主题下调完就完事,切到深色模式再看一遍。UD 字体在深色背景下的笔画会显得更细,因为亮色笔画在暗背景上有视觉膨胀的反向效应,同一套字号和字重,浅色下舒服的配置,深色下可能会觉得偏细发飘,把字重从 400 提到 450 或者把字号加 1px 能找补回来。