字体子集优化后为什么部分字符显示为方框?
我在使用Google Fonts时按文档配置了字体子集,但页面里的中文引号和特殊符号还是显示方框。代码明明写了subset: 'latin,latin-ext,cyrillic,devanagari',但像“这句的「中文引号」”里的符号就是不显示。我试过清除浏览器缓存、检查网络请求,字体文件确实加载了,但控制台没报错。是不是子集参数漏了什么?
@import url('https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,400;1,700&display=swap&subset=latin,latin-ext,cyrillic,devanagari');
body {
font-family: 'Roboto', sans-serif;
}
难道中文引号需要单独加subset参数?或者需要额外加载其他字体文件?
简单来说,Google Fonts 的 Roboto 字体并没有内置对中文符号的支持,即使你加载再多的子集也没用。控制台没报错是因为字体文件正常加载了,但它确实不包含你需要的字符,所以浏览器会 fallback 到默认字体,而默认字体可能也不支持这些符号,最终就显示成方框了。
解决办法有几个方向:
第一种,换一个支持中文符号的字体。比如你可以试试 Noto Sans 或 Noto Serif,这是 Google 推出的专门覆盖多语言字符的字体。代码可以这么写:
第二种,如果你非要用 Roboto,那得单独为中文符号指定一个 fallback 字体。比如可以加一个本地的中文字体作为备用:
这样,当 Roboto 没法渲染某些字符时,浏览器会自动尝试后面的字体。
最后提醒一下,字体子集的作用是减少不必要的字符加载,优化性能,但前提是这个字体本身得支持你需要的字符集。不然配再多 subset 参数也是白搭。
别走弯路,直接告诉你怎么解决:你需要额外加载
subset=chinese-simplified或者subset=chinese-traditional。修改你的@import代码:不过要注意,Roboto本身对中文支持不太好,即使加了chinese子集,可能还是会有部分字符显示异常。如果页面里中文内容较多,建议换用专门针对中文优化的字体,比如Noto Sans SC。
最后提醒一下,浏览器没报错是因为字体文件确实加载成功了,但里面压根就没有你要的字符编码,所以才会显示方框。这种情况控制台是不会提示的,坑死了吧 😅