岁月如歌

用开放的心态,打造专业的人生。

最佳 Web 中文默认字体

with 54 comments

最近淘宝网首页有个小小的 默认字体调整风波,中文默认字体远比我们想象中的复杂。以前主要关注 font-family 自身,忽略了 lang 属性和 charset 设置。今天做了个更详尽的测试:

http://lifesinger.github.com/lab/2011/default-fonts/

在不同操作系统下,用各个浏览器打开,特别是 Firefox 和 Opera,混乱的世界啊,真真的与浏览器斗,乐趣全无!

虽然沮丧悲情愤,但分析研究的工作还是得继续:

  • lang, charset 和 font-family 都会对默认字体产生影响,规律很复杂。
  • 浏览器偏好里的字体设置,对默认字体有直接影响,比如 WebKit 内核的 Chrome 浏览器。
  • 宋体转成 “\5b8b\4f53” 也不能通吃所有浏览器。比如在 Mac OS 的 Chrome 中,只认识 simsun.
  • 宋体其实是 serif 有衬线字体,后面跟 sans-serif, 逻辑上是错的。(修正:并没有规定前面的 font name 要和最后的 general family 保持一致)
  • 不同操作系统下,各个浏览器默认的 sans-serif 中文字体,一般都是最佳选择或用户已调整为最佳,不能强制用户都用宋体。

从目前用户反馈的情况来看,在以 12px 大小为主的网页设计中,最佳的中文默认字体方案是:Windows 下用宋体,其他操作系统下用雅黑等无衬线字体。未来随着电脑屏幕的变大和分辨率的提高,当字体的默认大小提高到 14px 以上时,或许所有操作系统下,最佳中文默认字体会统一为雅黑等无衬线字体。

为了让所有网页在尽可能多的情况下,都用最佳中文字体渲染,需要特别考虑以下几点:

  • 在 Mac Chrome 等环境下,用 font-family: times, sans-serif 时,中文字体并不会根据 sans-serif 渲染,而是会根据 times 的 serif 属性,选择默认的 serif 中文字体来渲染。比如在 Mac Chrome 下,默认 serif 中文字体是很接近宋体的一个字体,比较难看。(修正:实际情况更为复杂,请参考评论中的讨论)
  • 在 Firefox 中,只要 font-family 中有宋体,中文必然就用宋体展现。所以 font-family 中不能有宋体。
  • 当 lang=“zh-CN”, charset=“utf-8” 时,font: arial 在 Mac Firefox 等环境下,默认中文字体是宋体。
  • 在英文 Win7 下,只要 charset=“gbk”, 当 font-family 为 arial, sans-serif 时,默认中文字体是很难看的 Microsoft Sans Serif Regular.(修正:是 fallback 到了韩文字体 Dotum/Gulim(gulim.ttc)来显示,Dotum/Gulim 没有的字符最终会 fallback 到 SimSun,暂时不知道日文字体是否夹在中间。和 Microsoft Sans Serif 没有一点关系。)
  • Opera 是个恐怖的世界,不要尝试分析其规律,最后测试一下就好。

可以总结出:

  1. 如果页面 charset 是 utf-8, 完美的默认字体方案是:

    font-family: arial, sans-serif;
    

    无论省略 lang 还是设置为 zh-CN, 在各种环境下都满足预期。

  2. 如果页面 charset 是 gbk, 推荐默认字体方案为:

    font-family: arial;
    

    Chrome OS 下未测试,根据陈成博客上的反馈,好像会因为没有 sans-serif 而导致中文字体很难看。不过考虑 Chrome OS 还未正式发布,目前可以先忽略。

最后,个人推荐简体中文页面的最佳实践为:

html lang=zh-CN
charset=utf-8
font-family: arial, sans-serif;

测试环境说明:

Mac OS X 10.6.7
Chrome 10.0.648.204
Firefox 4.0
Safari 5.0.4
Opera 11.01

Win7 Ultimate
IE 9.0.8080.16413

2011-04-09 补充:

  1. 关于字体的默认大小和行高等信息,推荐秦歌的博文:默认 Web 字体样式
  2. 关于字体的 fallback 等文本渲染信息,推荐排版达人 jjgod 的博文:浏览器如何渲染文本

Written by lifesinger

April 6, 2011 at 11:21

Posted in Articles

54 Responses

Subscribe to comments with RSS.

  1. 对Arial过敏的人其实也可以在前边加些无害的英文字体啦。像Helvetica, Lucida Grande, 反正害不到Windows用户。

    cheng

    April 6, 2011 at 11:42

  2. Helvetica测试了没

    许岑

    April 6, 2011 at 11:50

    • Helvetica只是Mac下的默认字体吧,Win下又没有的

      Leeiio

      April 6, 2011 at 12:04

      • 就我所知,至少在 R2 上,Helvetica 是 Arial 的一个直接别名。

        注册表 FontSubstitutes 有写。

        Belleve Invis

        April 30, 2011 at 08:43

  3. 我觉得我可以在评论里补充点关于Sans Serif和 Serif字体的区别:

    * Serif的字体容易辨认,因此易读性较高。反之Sans Serif 则较醒目,但在行文阅读的情況下,Sans Serif 容易造成字母辨认的困扰,常会有来回重读及上下行错乱的情形。
    * Serif 强调了字母笔画的开始及结束,因此较易前后连续性的辨识。
    * Serif 强调一个word,而非单一的字母,反之Sans Serif则强调个别字母。
    * 在小字体的场合,通常Sans Serif比Serif更清晰。

    所以你会发现通常文章的內文、正文使用的是易读性较佳的 Serif 字体,而标题、表格內用字则采用较醒目的Sans Serif字体,它需要显著、醒目,但不必长时间盯著这些字来阅读。

    所以目前一些提供把网页转成Readability的服务都是指定的Serif字体。

    参考 https://www.readability.com/

    Leeiio

    April 6, 2011 at 12:00

    • Serif 字体确实公认易读,但这个公认是总结自理想情况下的——无限分辨率,无限清晰。生活中最接近这个理想情况的就是印刷,以及 Retina display 这样的超高像素密度的显示屏。
      而目前主力进行网页显示的屏幕都达不到这个水准,它们的像素密度都太低了,这时比 serif / sans serif 之争更重要的是为低像素密度的屏幕优化。
      而 serif 在很小的字号下容易让文本杂乱而模糊——除非是 Georgia 这样为屏幕显示优化的 serif 字体。这也就是你说的「在小字体的场合,通常 sans serif 比 serif 更清晰」。

      和 sans serif 比起来,serif 字体(我这里说的主要是西文 serif 字体)因为 serif 的存在而让文本的「行」的外观更加清晰、明确,有利于阅读,这是共识。但「字母辨认的困扰」主要是因为字体设计的问题,而不是 sans serif / serif 的差异。Verdana 和 Segoe UI 这样为屏幕小字号显示优化的 sans serif 字体都在字母的区分上下了很多工夫。

      「Serif 强调一个word,而非单一的字母,反之Sans Serif则强调个别字母。」这句话不合适。到底是强调每个字母,还是强调字母之间的关系(但也不是「强调一个 word」),这个更多地取决于字体设计,而不是 sans serif / serif。

      「所以你会发现通常文章的內文、正文使用的是易读性较佳的 Serif 字体,而标题、表格內用字则采用较醒目的Sans Serif字体,它需要显著、醒目,但不必长时间盯著这些字来阅读。」
      这段分析比较片面。

      使用 Readability 作为佐证是不合适的,因为 Readability 使用较大的字号,和 12–14px 的普通网页设计情况不一样。

      LIANG Hai

      April 6, 2011 at 15:44

      • 怎么说呢?你不觉得Sans Serif和 Serif字体的争议其实和个人喜好也有很大的关系么?很久以前我是很不喜欢Serif字体的,但是现在我确实很喜欢用Serif字体来进行阅读。评论确实很大一部分代表了个人观点。

        Leeiio

        April 6, 2011 at 21:23

      • 因为你用了那么客观的语气分析 sans-serif 和 serif,我才试图在类似的思路上平衡一下呀……蜗牛君……

        梁海

        April 6, 2011 at 23:51

  4. 仔细看了两遍文章和换了FF和CHROME看了测试页面,没条件动手试那么多平台。。。求教下如果我想在条件允许的情况下按如下顺序显示 雅黑,宋体,verdana, sans serif呢,该怎么写?

    xiaole

    April 6, 2011 at 13:20

    • 考虑到「宋体」是 Windows 下没有字体可用时的自动 fallback 字体(在没有微软雅黑的时候都会默认使用「宋体」),没有必要把它写出来。而且应该 font-family 中应当写字体的 family name。所以应该这样写:
      font-family: Verdana, “Microsoft YaHei”, sans-serif;

      另外,您的表述「按如下顺序显示 雅黑,宋体,verdana, sans serif」是有点问题的。如果优先使用微软雅黑和宋体,就基本上没有机会使用 Verdana 了,因为微软雅黑和宋体包含了 Verdana 中最常用的那些字符。

      LIANG Hai

      April 6, 2011 at 15:29

      • 纠正一个小瑕疵:宋体是中文 Windows 下自动 fallback 的字体,在英文 Windows 下,当页面编码为 GBK 时,自动 fallback 的字体是 Microsoft Sans Serif Regular.

        因此还是有必要写出来的:

        font-family: Verdana, “Microsoft YaHei”, SimSun, sans-serif;

        lifesinger

        April 6, 2011 at 16:14

      • 事实上,Microsoft Sans Serif 的字符集并不包含汉字,所以没法用它来显示汉字。
        我有点困惑,不知「自动 fallback 的字体是 Microsoft Sans Serif Regular」到底是什么情况。在有 Verdana 先导的情况下,即使是西文也基本看不到 Microsoft Sans Serif 显示出来。

        文章中提到的「默认中文字体是很难看的 Microsoft Sans Serif Regular」可能和 Arial Unicode MS 有关,请查证。

        LIANG Hai

        April 6, 2011 at 17:23

      • 做了一个截图:

        Win7 英文版 IE9 下

        可以看出 gbk 编码时,font: arial, sans-serif 下中文字体与宋体有差异。不确定是不是 Microsoft Sans Serif. 系统里没有 Arial Unicode MS, 应该不是这个。

        @LIANG Hua 参考下。

        lifesinger

        April 6, 2011 at 18:00

      • 这个是某几种 CJK 点阵字体混合的产物,和 Microsoft Sans Serif 确实无关(整个截图里只有最后一格里的拉丁字母是 Microsoft Sans Serif),这个「英文 Windows 的 IE 在 GBK 下用 Microsoft Sans Serif 显示中文」的说法是谁最先提出的呢?

        从「乃」字看,这个效果比较像 MS Mincho(Windows 默认的日文点阵字体,和 SimSun 的地位一样),而部分日文没有的字符(比如「纳」)就 fallback 到了 SimSun。
        在英语的 locale 下,字体 fallback 顺序中的日文字体在中文字体前很正常。
        麻烦有空的时候把最后一格的字号增大到 96px 再做一个截图。那样就比较容易判断是什么字体了。多谢!

        噢,我刚刚才知道,Arial Unicode MS 是随 Office 分发的字体,在干净的 Windows 里确实不会有。

        梁海

        April 6, 2011 at 19:31

      • 截了一张大图:

        梁海再帮忙看以下,好像的确 fallback 到日文字体了,“纳”字貌似是宋体。

        lifesinger

        April 6, 2011 at 20:51

      • 天哪……这个是从 Windows XP 开始就自带的韩文字体 Dotum/Gulim(gulim.ttc)的汉字部分……
        Windows 的英文 locale 下的文字 fallback 顺序中,韩文居然这么优先……

        由此,「Microsoft Sans Serif」的误解澄清了。
        在英文 IE 的 locale 下,如果使用 GBK,lang=zh-CN 会失效,汉字会 fallback 到韩文字体 Dotum/Gulim(gulim.ttc)来显示,Dotum/Gulim 没有的字符最终会 fallback 到 SimSun,暂时不知道日文字体是否夹在中间。和 Microsoft Sans Serif 没有一点关系。

        梁海

        April 7, 2011 at 00:07

      • 莫非和字母表的顺序有关?

        Belleve Invis

        April 30, 2011 at 08:47

  5. @xiaole: 中文字体里含有英文字体,针对你的需求,建议写成:

    font-family: verdana, “微软雅黑”, “宋体”, sans-serif;

    缺点是,当用户电脑没有安装雅黑和宋体时,缺省中文默认字体,在不同环境下有可能不同。

    lifesinger

    April 6, 2011 at 13:24

    • MSYH 根本不适合正文,因为字距太小,字形扁。MSYH 适合往控件上放,长篇的正文还是传统些比较好。

      be5invis

      April 6, 2011 at 13:41

      • +1
        我也觉得雅黑不适合做正文阅读字体。

        old9

        April 7, 2011 at 09:00

      • 雅黑扁得不明显,15和16px阅读相当好。手机上一直用它。FF里也设置成它。

        xiaole

        April 7, 2011 at 18:49

  6. 这篇日志中有一些误解:

    1. 关于 CSS 的 font-family 属性的书写。
    根据 CSS 标准,应该使用字体的「family name」,而 Windows 的这个宋体的 family name 是「SimSun」(类似的,微软雅黑的 family name 是「Microsoft YaHei」)。Family name 是字体文件内部写有的一个重要元数据,而 family name 之外的字体名支持都不是必须的。所以 Mac OS X 里的 WebKit 不认「宋体」这俩字符,不管它转换成什么。很多人写「宋体」、「微软雅黑」的这种习惯都不是很好。

    2. 「宋体其实是 serif 有衬线字体,后面跟 sans-serif, 逻辑上是错的。」
    其实这里面没有什么逻辑。CSS 的 font-family 属性要求最后以一个 generic family 结尾,这个 generic family 并不是必须符合前面字体的分类。

    3. 「在 Mac Chrome 等环境下,用 font-family: times, sans-serif 时,中文字体并不会根据 sans-serif 渲染,而是会根据 times 的 serif 属性,选择默认的 serif 中文字体来渲染。比如在 Mac Chrome 下,默认 serif 中文字体是很接近宋体的一个字体,比较难看。」
    这个和 Times 属于 serif 无关。CSS 属性 font-family 的最后一项 generic family 的表现不会受前面的 family name 的影响,它只受浏览器自己的参数影响。因为中文长期缺乏可用的 sans serif 正文字体,所以大多数 Windows 浏览器把自己的 serif 和 sans-serif 的最终 fallback 字体都设定成了「宋体」(也就是「SimSun」),而 Chrome for Mac 是个怪胎,不知道用 Mac OS X 的默认华文黑体(STHeiti),却用了华文宋体,大概是受 Windows 的影响。

    另外,说明一下:
    每个浏览器都有自己对 generic family 的一套设置,一般根据语言(遵循 HTML 中的 lang 属性)有所区分。这套设置一般包含两项:1. generic family 的默认字体(比如遇到一个单独的 sans-serif 时用什么字体来渲染);2. generic family 最终的 fallback 字体(比如遇到「Helvetica, “Microsoft YaHei”, sans-serif」时,一些微软雅黑里没有的字符得用什么字体来渲染)。你打开 Firefox 的 about:config,然后筛选出带「font」的项目,然后就明白了。

    呃,Opera 确实是个悲剧(尤其是在 Mac OS X 里),值得忽略。

    唉,大家对 CSS 的字体属性的误解太多了。先写这些。

    LIANG Hai

    April 6, 2011 at 15:23

  7. 感谢 @LIANG Hai 指正,明白清晰了很多。

    第 1 点,不用 SimSun 标准写法,都是天杀的 Opera 惹的祸。用转义等写法,是避免页面编码和 CSS 文件编码有时不一致导致的问题。不考虑 Opera 的话,推荐还是标准的 SimSun.

    第 3 点,Mac Chrome 下,当 font-family: arial, serif; 时,中文字体并不会 fallback 到 serif, 而是直接根据 arial 所属的字体族,fallback 到了默认的 sans-serif 字体。这个处理很奇怪,但在 Mac Chrome 下的确如此。

    anyway, 感谢 @LIANG Hai ^o^

    lifesinger

    April 6, 2011 at 16:44

    • 嗯……Opera 这货……

      第 3 点,你可能还是有一点误解。这个和 general family 之前的字体确实没有什么关系。Chrome for Mac 的中文 sans serif 字体默认为「华文黑体(STHeiti)」,而 serif 我默认为「华文宋体(STSong)」。而在 Chrome 的设置中,只有一个所谓的「默认字体」可以编辑,这个似乎对应的是 serif 的设置。而中文的 sans serif 设置似乎一般没法更改,锁定在「华文黑体」了。
      我在 Chrome for Mac 中没有观察到「Times, sans-serif」和「Arial, serif」的 general family 反转的现象。当我把 Chrome 的设置中的所谓「标准字体」设置为「华文宋体」,如果遇到「Times, sans-serif」,就显示 Times 的西文和华文黑体的中文;遇到「Arial, serif」时,就显示 Arial 的西文和华文宋体的中文。

      Mac OS X 10.6.7; Chrome 10.0.648.204

      LIANG Hai

      April 6, 2011 at 17:49

      • 嗯,这个有点奇怪,我的 Chrome 是默认设置,偏好的默认字体是 Times. 此时出现了 general family 反转的现象。

        Chrome 的默认字体设置为华文宋体,则不会出现,规律和你说的一样。

        lifesinger

        April 6, 2011 at 19:27

      • 汗……抱歉……我以为 Chrome for Mac 的默认设置是「华文宋体」,但看来是记错了……我去试试设置成 Times 的情况…… -_-

        梁海

        April 6, 2011 at 19:49

      • 我做了一堆实验,基本明白了:

        Mac OS X 里,Chrome 和 Safari 都会对 general family 缺失或 general family 和第一个 family name 不符的 font-family 做出修正。
        这时,Safari 完全忽略 CSS 中的 general family,然后使用第一个字体所属的 general family;而 Chrome 只在 general family 缺失的情况下使用第一个字体所属的 general family,如果有 general family,不管它和第一个字体是否相符,都遵守它。
        Safari 的 serif 和 sans-serif 中文字体 fallback 分别是华文黑体和华文宋体;而 Chrome 的 serif 和 sans-serif 中文字体 fallback 都是华文黑体。
        似乎圆满解释了。

        Safari 还真是怪胎啊……

        梁海

        April 6, 2011 at 20:54

      • 我前面的测试有误,当 Chrome 的默认字体设置为 STHei 或 STSong 时,font-family: times, sans-serif 下,中文默认字体依旧是宋体,而不是华文黑体。

        测试环境:Mac OS X 10.6.7 界面语言:English
        Chrome 10.0.648.204 界面语言也是英语

        我怀疑跟界面语言有关系。

        lifesinger

        April 6, 2011 at 21:04

      • 梁海,你的 Chrome 界面语言是啥?

        我怀疑:

        Chrome 的 serif 和 sans-serif 中文字体 fallback 都是华文黑体。

        仅在 Chrome 界面语言为中文时如此。

        我的测试情况,Chrome 和 Safari 一致。我的 Mac 和浏览器,都设置为英文界面。

        lifesinger

        April 6, 2011 at 21:07

      • 改成英文介面之后更晕了……

        Helvetica, serif; 显示华文黑体
        Helvetica; 显示华文黑体
        serif; 显示华文宋体

        Times, sans-serif; 显示华文黑体
        Times; 显示华文宋体
        sans-serif; 显示华文黑体

        暂时找不到明确的规律。而且改回中文也还是这样。晕了。

        梁海

        April 7, 2011 at 01:35

      • 这个问题是所有 WebKit 浏览器都一致的,感兴趣的可以关注这个 bug: https://bugs.webkit.org/show_bug.cgi?id=57951 (我提供了 Mac 下的 patch,对 Safari 和 Chrome for Mac 有效,其他平台下也可以做类似的修改)

        jjgod

        April 7, 2011 at 01:54

  8. font name 的问题,我突然想起来宋体的 Font Name 就是 “宋体”,SimSun 反而是别名。刚才在 Window 的 Fonts 打开宋体看了下,字体信息里的 Font Name 是中文。

    搞错了,删除。参考这篇文章:
    http://www.cnblogs.com/ruxpinsp1/archive/2008/06/26/font-in-front-end-development-4.html

    宋体的正式名称是 SimSun, “宋体”是别名。

    lifesinger

    April 6, 2011 at 18:02

    • 我记得以前你有篇文章说道Opera支持SimSun写法的啊?只要后面没有其他中文字体就可以了。

      Sivan

      April 15, 2011 at 15:12

  9. 微软雅黑比宋体大同样是12px

    赵弟栋

    April 6, 2011 at 22:01

  10. 确实,原来Tahoma字体在UTF-8编码情况下,在ie6,7,8下对行高的解析差异很大!

    愚人码头

    April 7, 2011 at 08:49

  11. Opera可以指定Generic Font Family的字体(包括Cursive,Fantasy,Monospace,Sans-Serif和Serif),Sans-Serif和Serif对应的中文字体是”宋体”,Monospace为”新宋体”。
    如果有用户指定了这些字体族,那么无论页面如何定义都应该按用户的设定显示这是应该的。

    还有一个是国际字体和 网页 下面的未定义样式选择何种字体,国际字体就是,国际字体应该就是你们说的fallback到的字体,用户可以针对每种语言进行不同的设置,默认情况下与 未定义样式 字体相同。

    猜测 未定义样式 字体的定义应该与系统有关,中文windows默认非等宽宋体,等宽新宋。

    BB9z

    April 7, 2011 at 17:14

  12. 一直没找到喜欢的中文字体。。。偏好雅黑多一点。。

    Shows CAI

    April 24, 2011 at 05:17

  13. 字体这玩意,自己看的舒服就可以了。

    花花电影

    April 24, 2011 at 09:41

  14. […] 原文:https://lifesinger.wordpress.com/2011/04/06/best-web-default-fonts/#more-157 […]

  15. 还有这么多的学问?

    设置个字体。

    楼上的很专业。

    OneDou

    May 2, 2011 at 20:08

  16. […] font-family Posted by admin on 2011 年 05 月 06 日 Leave a comment Go to comments 以前对这个属性理解的一直不是很深,设置的时候也只是随便copy一下,至于跨浏览器或者平台更没有关注。今天看到最佳web中文默认字体这篇文章才发现font-family这个属性的水很深! […]

  17. 1、
    2、
    3、font-family:Tahoma,Verdana,Helvetica,微软雅黑,宋体,Arial,”Arial Unicode MS”,MingLiu,PMingLiu,”MS Gothic”,sans-serief;

    中英文混排的时候,把英文用括起来,单独社会子

    蛙蛙王子

    June 30, 2011 at 11:49

  18. I like this web site and have absolutely saved it. I‘ll look to learn in details on my trip

    Brent

    September 15, 2011 at 00:06

  19. 真不错,提供了相当专业和丰富的知识,感谢。

    土木坛子

    September 16, 2011 at 00:08

  20. […] 字体用宋体的较多,因为这个字体很普遍,但如今的年代——尤其是Windows 7的流行,可能用微软雅黑的效果和可读性更好——无衬线体的优点,但这只对Windows平台适用。Linux下面自然是文泉驿字体为首选(包括Android手机系统),所以修改CSS字体时能增加微软雅黑的并不多见,能再加上文泉驿的更是凤毛麟角,少之又少。现在的网民所用的系统平台已经多元化了,因此最好能兼顾各个平台系统。关于字体更深度的知识可以参考这里:最佳Web中文默认字体,浏览器如何渲染文本,网页字体分析推荐Verdana, SimSun, Arial. […]

  21. 我也為了IE中字不等高的問題困擾中….

    Benson

    March 20, 2012 at 05:17

  22. 学习了,一直觉得字体和字间距是影响网页设计美观的重要因素啊

    design初学者

    May 6, 2012 at 00:43

  23. 继续研读中

    design初学者

    May 6, 2012 at 00:45

  24. Aw, this became a very good post. In concept I have to put in writing in this way also – spending time and real effort to generate a great write-up

    burton hoodie

    May 24, 2012 at 12:35

  25. […] 3. 中文字体,还没摸索出个结论(不同操作系统会不会也有影响?),但是这篇文章好像说得很有道理:最佳 Web 中文默认字体。文章推荐的中文网页的最佳实践是: […]

  26. http://www.microsoft.com/zh-tw/default.aspx

    font-family: “微軟正黑體Microsoft JhengHei”,”微軟正黑體 Microsoft JhengHei”,”Microsoft JhengHei”,”微軟正黑體”,”Tahoma”,”Verdana”,”Arial”,”sans-serif”;

    DDT

    September 21, 2013 at 01:27


Leave a reply to 蛙蛙王子 Cancel reply