编码和字体[zz]

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

一直有个疑问:字体文件使用什么编码来组织字体(字形)信息的?
今天查到一个资料,按资料上的说法,字体文件中的字形信息的组织应该是按照UNICODE编码来组织的,也就是说我们如果要显示一个字符串,则需要对每一个字符找出其UNICODE编码,然后通过UNICODE编码在字体文件中查找字形信息。
 
 

我们看到屏幕上的一个个字符,它们是如何显示出来的?表面上看很
简单,其实是很复杂的。

首先,不同的操作系统会采取不同的方式,既然你在 LinuxApp 版问,
那么我也就就 Linux 的情况谈, 首先看最底层的情况,单个的字符
如何渲染出来。另外,下面讲的主要是 TrueType Font 和 TrueType
Open 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/p/2680618.html