网站字体渲染过程

news/2024/5/8 12:58:33/文章来源:https://blog.csdn.net/xiebaochun/article/details/49366311
{0D397153-FBC5-4E04-9FBC-150F2BE902FB}

前言

我们知道同一种字体在不同浏览器上的表现有可能是不同的,除了浏览器,还有哪些导致表现不同的因素呢?不同系统下字形的渲染也是不一样的,根本原因是什么呢?我们希望各浏览器下字体排版一致,实现的话有完美的方案吗?

带着这些问题我们来看看字体渲染的过程:

解码

了解解码之前,我们稍微先简单回顾下编码的一些知识,常见的名词有:ASCII 、GB2312、Big5、Unicode、UTF-8,它们之前有什么区别或联系呢?简单来说,起初美国国家标准协会ANSI制定了一个标准,规定了常用字符的集合以及每个字符对应的编号,这就是ASCII字符集(Character Set),也称ASCII码,当计算机慢慢发展,人们发现之前的128个的字符不能满足需求了,于是便在原基础上进行扩展,GB2312、Big5等都属于扩展后的编码方式,再后来呢,为了实现在一份文档中可以正确显示所有类型的字符,于是Unicode字符集诞生了,而UTF-8是Unicode的实现方式之一, 与之相似的还有UTF-16和UTF-32。

回顾了编码,我们再来看解码,浏览器收到网页内容后,首先需要把这些内容转化为可阅读的文本,上面我们也提到了,不同国家或语言会使用不同的编码方式,那怎么去判断编码方式呢,方法有下面这些(优先匹配前面的规则,如果没有,则按顺序往下匹配):

  1. Web 服务器返回的 HTTP 头中的 Content-Type: text/html; charset=“”的编码
  2. 网页本身 meta header 中的 charset 部分
  3. 浏览器菜单里一般允许用户强制指定编码
  4. 部分浏览器 (比如 Firefox) 可以选择编码自动检测功能,使用基于统计的方法判断未定编码。

分段

编码方式确定后,网页的内容就被转化为Unicode字符了,分段的过程就是将文本分为由不同语言组成的小段.

选择字体

下面我们来谈谈字体,字体的分类大致有下面这些:
1. 点阵字体(Bitmap Fonts)
2. 轮廓字体(Outline Font)
2-1. PostScript字体
2-2. TrueType字体
2-3. OpenType字体
3.笔画字体(Stroke-based font)
4.METAFONT

如何理解点阵字体和轮廓字体的区别呢,其实它们的表现和图片格式中的png8和png24的的区别很类似,点阵字体都是实色,没有过渡色,边缘锐利,而轮廓字体有过渡色,边缘也比较平滑。很多人把“宋体”(simsun)当作点阵字体,其实不是,它和“微软雅黑”(microsoft yahei)一样,都属于轮廓字体,只不多12px~17px的宋体内置了点阵信息而已。

如果按照字形来分的话,字体又可以分为:

  • 衬线(serif)
  • 非衬线(sans-serif)
  • 等宽字体(monospace )
  • 书写体(cursive)
  • 梦幻体(fantasy)

注:其中“serif”表示”字脚”、“装饰”的意思,而“sans”来源于法语,是“无”的意思。

常见的衬线有下面这些,字形的末端都会有“脚”:
font_1
常见的非衬线有:
font_2

而系统所包含哪些字体跟什么有关呢?当我们想用一种字体,但不确认这个字体是否是系统已有的,怎么去确认呢?

首先系统所包含字体不只和系统预装的字体有关,还和系统上安装哪些软件有关,微软操作系统下,详细的系统和一些软件包含的字体可以查看这个索引:Microsoft typography,Mac系统可以查看这个索引:List of typefaces included with OS X

再让我们回到网页中,CSS里如果font-family未设置中文字体时,我们知道是根据浏览器默认的字体来显示,找到浏览器对应的设置,你也可以手动修改这些。

1
p{font:12px/24px Tahoma;}
2
p{font:12px/24px Arial;}

以上两种写法按照前面我们所说的规则来说,在同一个系统和浏览器中匹配的是唯一的字体,那么它们的显示还会有区别吗?看看下面Windows系统下部分浏览器的测试结果:

windows下浏览器渲染

仔细看,你会发现IE6,IE8,Chrome,Firefox下文字底部不在同一水平线上的。所以由此得知:英文字体不会影响中文的字形,但会影响其位置。可是…为什么会影响位置呢?我们再来看下网页中的文字的位置到底是怎么被控制的:

字体渲染

默认的规则是:用行高(line-height)减去内容区(content area)的高度所得到的值一分为二,各放在内容区的上面和下面,但不同浏览器的渲染不同,并且结合上面的测试结果,就算内容区的位置是相同的,文字在内容区的位置还可能不同。
而影响文字在内容区的位置的因素有下面几个,也就是说这也不是统一的。

  • 字体类型
  • 排版引擎
  • 浏览器

排版引擎

总的来说,Mac OS X用户使用CoreText渲染引擎,Windows7 和Windows Vista用户使用DirectWrite 或 GDI,而Windows XP则使用GDI.
对比图片来看看它们之间的区别,其中上图为FacitWeb字体,下图为 Minion Pro字体。

bove: Core Text rendering of FacitWeb (above) and Minion Pro (below).

Core Text 渲染引擎

Above: DirectWrite rendering of FacitWeb (above) and Minion Pro (below).

DirectWrite渲染引擎

Above: GDI rendering of FacitWeb (above) and Minion Pro (below) with ClearType enabled.

GDI渲染引擎,开启ClearType

Above: GDI rendering of FacitWeb (above) and Minion Pro (below) with Standard antialiasing.

GDI渲染引擎,标准抗锯齿(Standard antialiasing)

Above: GDI rendering of FacitWeb (above) and Minion Pro (below) with no antialiasing.

GDI渲染引擎,无抗锯齿(no antialiasing)

注:iOS和Mac的渲染引擎一样,但采用的是灰度渲染,默认情况下亚像素抗锯齿是关闭的,但可以通知设置开启。

所以不同系统因为渲染引擎的不同,导致文字在细节上也表现不同,在这里顺便说下微软和苹果两家公司对于字体表现的不同风格,苹果公司更专注于还原字形设计的本来面貌,使字形更优雅、平滑。而微软则更倾向字体的清晰,可读性。

浏览器

确认了排版引擎,我们再来看看浏览器,浏览器会有布局引擎,它来决定是怎样用html结构,css样式表来你渲染网页。布局引擎和网站外观表现是息息相关的,但是对于字形渲染,绝大部分还是由操作系统的文本渲染引擎来控制的,这就很好的解释了为什么同样的浏览器,在不同的操作系统下有不同的字形表现,见下图:

Windows下各浏览器所使用的渲染模式。

Windows下各浏览器所使用的渲染模式。

光栅化

当确定了编码、字体类型、排版引擎、浏览器后,就要进行光栅化过程了,光栅化是将文字从一个向量表示(比如一个TrueType字体)转化到光栅或者位图表示的过程。在这个过程中往往涉及到一些抗锯齿技术来使得屏幕上的字体更加平滑易读,这也经常会涉及到”字体微调(font hinting)”技术。

总结

现在再回过头来说说研究字体渲染的初衷,细节控对于不同浏览器像素级统一有时候要求是很极致,研究的目的是想做出一套方法来实现它们的统一。可现在我们知道,这和字体类型、系统排版引擎、浏览器都有关系,并且排版引擎有多种,这里还没有加上Linux,Android系统,浏览器就更不用说了,如果再加上移动端,就更复杂了。所以完美的方案是近乎没有的,就算写一大堆的hack。

如果再跳出来看这个问题,我们真的一定需要让不同浏览器在字体渲染方面的表现完美一致吗,其实普通的用户不是专门测试人员,不会打开所有浏览器对比区别,所以细微的差别对普通用户来说几乎是无法感知的,是的,我这里说的是“细微”,但是如果差别比较离谱,这些导致表现不同的原因都不会成为借口。

注:头图来自 http://www.gettyimages.cn/

参考资料:

  • http://blog.jjgod.org/2011/04/09/how-do-browsers-render-text/
  • http://jjgod.org/docs/slides/TextRenderingWithQt.pdf
  • http://blog.typekit.com/2010/10/05/type-rendering-on-the-web/
  • http://blog.typekit.com/2010/10/15/type-rendering-operating-systems/
  • http://blog.typekit.com/2010/10/21/type-rendering-web-browsers/
  • http://blog.typekit.com/2010/11/09/type-rendering-the-design-of-fonts-for-the-web/
  • http://blog.typekit.com/2010/12/08/type-rendering-font-outlines-and-file-formats/
  • http://blog.typekit.com/2010/12/14/a-closer-look-at-truetype-hinting/
  • http://blog.csdn.net/easebone/article/details/7382633
  • http://zh.wikipedia.org/wiki/%E7%94%B5%E8%84%91%E5%AD%97%E4%BD%93

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_861097.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ASP.NET 2.0网站专案同时使C#与VB.NET之技巧(新书连载)

ASP.NET 2.0网站专案同时使C#与VB.NET之技巧(新书连载) 你知道专案ASP.NET 2.0网站要如何同时使用C#与VB.NET两种语言及多组件的技巧吗? 节录自【圣殿祭司的ASP.NET 2.0专家技术手册】新书 在以往VS.NET 2002及VS.NET 2003的Visual Studio工具…

shell脚本实战之统计web网站不同连接状态个数

1 #!/bin/bash2 declare -A he //定义关联数组3 arraynetstat -antlp |grep 80|awk -F" " {print($6)} 定义索引变量4 for i in $array //取值5 do6 let he[$i] //让元素加一 7 done8 9 for j in ${!he[]} key[value] :key值可以…

借助HttpCombiner让你的网站加速

上一篇 < 利用Microsoft Ajax Minifier在服务器端对静态资源进行自动化压缩 > 得到不少有意义的交流和建议,最近也在不停的尝试做一些网站优化的工作,我会陆续的写一些或者翻译一些优化方面的文章跟大家交流,一方面提供给有需要的朋友一些参考,另一方面也希望得到高手们的…

从“奥运门票网站800万访问量”想到的成本、质量、进度、风险等关系

看到这个新闻后颇有一番滋味&#xff0c;更体验到我一直关注的软件性能着实无处不在&#xff0c;这个案例也确实值得我们好好反思一下。 不知道网友们有没有报名参加国际日语考试的——这个网站每年05年前都有人不能报名&#xff0c;因为报名人数太多&#xff0c;所以报名当日大…

Google 联合一些社交网站来对抗 facebook

谷歌 (Google) 将与其它一些行业领先的社交网站联手&#xff0c;共同对抗互联网新贵Facebook。  谷歌将于周四推出一个通用标准集 ( OpenSocial )&#xff0c;允许软件开发者为谷歌旗下社交网站Orkut&#xff0c;以及LinkedIn、hi5、Friendster、Plaxo和Ning等其它社交网站…

【Abp VNext】实战入门(十一):【1】基本操作 ——VS编译调试时 .NetCore Web网站Api如何在局域网电脑上访问

一、前言 最近使用 AbpVnext .NetCore 开发项目&#xff0c;网站启动后可以通过 http://localhost:44349 或者http:127.0.0.1:4349正常访问&#xff1b; 但是通过本机局域网IP http://192.168.1.101:44349 却无法访问&#xff0c;防火墙里面44349端口入栈规则也配置了&#x…

【Abp VNext】实战入门(十一):【3】基本操作 ——.NetCore Web网站Api发布部署及如何在局域网电脑上访问

文章目录 一、前言二、步骤1、VS2019编译发布项目&#xff1a;2、直接启动服务&#xff1a;默认地址端口访问3、带参启动服务&#xff1a;指定地址端口访问 三、总结 一、前言 上一章讲解了在VS编译调试的时候如何通过局域网访问.netcore 网站API服务&#xff1b; 这一章主要…

【Abp VNext】实战入门(七):【2】xxx.Web网站层 —— API接口异常全局捕捉,返回简化错误信息

这里写自定义目录标题 一、前言二、解决方案1、解决方案1&#xff1a;2、解决方案2&#xff1a; 三、总结 一、前言 今天突然发现一个问题&#xff0c;xxx.Application应用层中的方法&#xff0c;如果直接抛出异常&#xff08;如&#xff1a;throw new Exception(“手动抛出异…

【流媒体服务】Web网站服务搭建(四):【1】下载安装Nginx网站服务

文章目录 前言一、Nginx是什么&#xff1f;二、安装步骤1、下载Nginx2、解压缩Nginx3、配置Nginx 三、启动预览Nginx网站服务1、启动网站服务2、浏览器预览网站3、如何增加个人网页 四、总结 前言 上2章节讲解了本地视频推流拉流服务VLC以及推流转码服务FFMPEG。 为了实现在网…

Red Hat推出”MugShot”社交娱乐网站

网址: http://mugshot.org/ Red Hat近来推出”MugShot”网站, MugShot是一个致力于在线社交娱乐的开源项目. 它提供了更方便的网页和音乐分享. 当前MugShot处于测试阶段, 只提供邀请帐号. 你可以从这里申请. 更多信息见常见问题和开发主页. 欢迎任何问题和建议.

10个学习资源网站

1 mooc学院 MOOC学院的定位是讨论&#xff0c;点评和记录课程&#xff0c;MOOC学院不直接收录课程内容&#xff0c;只是专注于帮助学习者互相交流&#xff0c;发现课程。你可以在这里发现很多有意思的课程 2 学堂在线 学堂在线是基于互联网技术的新型学习平台&#xff0c;旨在…

WordPress主题可视化建站The7 V8.7

The7汉化版是一个非常漂亮的企业主题&#xff0c;功能非常强大&#xff0c;内置可视化编辑器&#xff0c;操作方便&#xff0c;支持layer和revsilder幻灯片&#xff0c;支持视网膜屏幕、支持自适应&#xff0c;所以流动元素都已集成。不管是企业门户或者个人网站、工作室都非常…

使用requests爬取实习僧网站数据

任务要求&#xff1a; 爬取实习僧网站的招聘公司信息和职位信息&#xff0c;并存储到数据库中&#xff0c;对应的数据库表和需要爬取的字段见下面表一和表二&#xff08;注意&#xff1a;爬取存在的字段&#xff09; 代码以上传带github上&#xff1a;使用requests爬取实习僧网…

程序员实用工具网站

程序员实用工具网站 本文链接&#xff1a; https://blog.csdn.net/m0_38106923/article/details/100130354 1、搜索引擎 2、PPT 3、图片操作 4、文件共享 5、应届生招聘 6、程序员面试题库 7、办公、开发软件 8、高清图片、视频素材网站 9、项目开源 10、算法 11、…

解决通过无线路由上网,但有些网站打不开的问题

问题背景&#xff1a;正常联网状态&#xff0c;所有网站&#xff08;除了腾讯视频页面&#xff09;访问正常&#xff0c;就是进不去腾讯视频&#xff0c;网上查&#xff0c;有人说是找不到DNS的原因&#xff0c;所以今天我就专门看了一下无线路由器DNS。并对本机的无线设置做了…

网站访问过程

1、pc到结束访问的全过程 首先发送dns报文进行dns解析 然后建立tcp连接 web服务提供页面信息 首先发送dns包&#xff0c;进行域名解析&#xff0c;数据链路层报文头&#xff08;数据链路层&#xff09;&#xff0c;ip层头&#xff08;网络层&#xff09;&#xff0c;udp头&…

win7利用映射网络驱动器功能管理网站FTP空间

win7利用映射网络驱动器功能管理网站FTP空间 首先打开windows资源管理器&#xff0c;最菜单栏找到映射网络驱动器 弹出设置界面&#xff0c;我们选择最下面的“连接到可用于存储文档和图片的网站”&#xff0c;弹出向导&#xff0c;选择下一步 选中“选择自定义网络位置”&…

网站API自动化测试利器——Postman

转自&#xff1a;http://bayescafe.com/tools/use-postman-to-test-api-automatically.html 如有侵犯&#xff0c;请来信oikenqq.com 自从开始做API开发之后&#xff0c;我就在寻找合适的API测试工具。一开始不是很想用Chrome扩展&#xff0c;用的WizTools的工具&#xff0c;后…

用 Certbot 一键升级你的网站为 Https

转载自&#xff1a;https://www.v2ex.com/t/383032 如有侵犯&#xff0c;请来信&#xff1a;oikenqq.com 原文&#xff1a;(用 Certbot 一键升级你的网站为 Https)[https://lufficc.com/blog/upgrade-to-https-with-certbot] 小站以前采用的是 StartSSL 的 https 证书&#xf…

使用Chrome下载网站视频

引论 在现实生活中&#xff0c;我们经常需要下载一些视频&#xff0c;但是这些视频又没有提供下载的链接或者需要下载客户端。怎么办呢&#xff1f;使用Chrome可以下载大部分网站上的视频&#xff0c;让我们一起学习一下 流程 使用Chrome打开需要下载视频的网站按F12&#xf…