编码和字体[zz]

it2022-05-05  135

地址:http://blog.chinaunix.net/uid-13423994-id-3212291.html

 

一直有个疑问:字体文件使用什么编码来组织字体(字形)信息的? 今天查到一个资料,按资料上的说法,字体文件中的字形信息的组织应该是按照UNICODE编码来组织的,也就是说我们如果要显示一个字符串,则需要对每一个字符找出其UNICODE编码,然后通过UNICODE编码在字体文件中查找字形信息。   以下是资料的内容:(资料来源: http://bbs.nankai.edu.cn/cgi-bin/bbs/bbsanc?path=/PersonalCorpus/M/mechanics/DADC75C24/DA5A504A0/M.1161349893.A)  

我们看到屏幕上的一个个字符,它们是如何显示出来的?表面上看很简单,其实是很复杂的。首先,不同的操作系统会采取不同的方式,既然你在 LinuxApp 版问,那么我也就就 Linux 的情况谈, 首先看最底层的情况,单个的字符如何渲染出来。另外,下面讲的主要是 TrueType Font 和 TrueTypeOpen Font 的情况, 如果谁有兴趣知道 Type1 或者 CFF Font 的情况,我们以后再谈。每个字体都包含一个或者多个的字符映射表 (character map),简称char map,比如我们所使用的绝大多数汉字字体包含的都是一个 Unicode的字符映射表,即,你给出一个 UTF-16 编码的字符,它可以告诉你这个字符对应的字形 (glyph) 在哪里。要让 FreeType 渲染出一个字符,所必须指定的就是要求渲染字符的char code (字符码) 和当前使用的 char map。如果我们使用 Unicode的 char map,那么指定的 char code 也必须是 UTF-16 编码。那么相信你会想到,如果我用 UTF-8 的 locale,那所有的文本编辑器中默认存储的字符都是 UTF-8 编码的数据,谁来帮我完成这个UTF-8 -> UTF-16 的转换呢?答案是 Layout Engine,俗称排版引擎,不同的程序有可能使用不同的排版引擎,同一个排版引擎也可能使用不同的字体渲染器 (font rasterizer,  准确地说是字符光栅化处理器),比如说 GTK+ 的程序一般使用 Pango 作为 Layout Engine,Eclipse 使用 ICU 作为 Layout Engine,Java 的 AWT/Swing 程序使用 Sun 自己的 Layout Engine,Qt 程序也有自己的 Layout Engine。需要比较复杂的排版效果的程序,比如浏览器,一般都会有自己的排版引擎,处理诸如图文混排等复杂情况。Layout Engine 要处理的当然不只是格式转换这么简单的事情,像字体选择 (font selection)、文字绕排 (text wrapping)、bidi(从左至右书写) 等复杂的情况都属于 Layout Engine 工作的范畴。最后顺便说说 Linux 下我们常见的几个库分别用来干什么。fontconfig其实给出的只是用户对字体选择的一个建议,Xft 是决定字体该通过什么手段画出来,是 XRender 的加速方式呢?还是 X 的原始方式。而 pango 则参考 fontconfig 提供的信息,调用 Xft 去绘制 FreeType提供的数据——FreeType 提供了什么数据?轮廓字体渲染得到的 256级灰阶图像。

转载于:https://www.cnblogs.com/linucos/archive/2012/09/11/2680618.html


最新回复(0)