zoukankan      html  css  js  c++  java
  • 关于字体

    字符编码和字体的关系

    1. 字体是语言文字的书面表示,对于普通的书面交流,我们可以将字体在我们脑海中的图像影像画在纸上,例如我们写信时实际上就是在画字的形状。我们之所以能够正确地“画出字体”(实际就是我们平时说的写字),是因为我们从小就接受这种训练-----识字------实际就是记住字的形象,书面交流是把要表达的意思用我们脑海中记忆的图像(及文字)画出来即可。

    2. 现在考虑计算机如何显示文字,首先要明确的一点就是,计算机可不会从一年级开始学习识字,也就是计算机它是没有大脑的,它不能将文字转换成“脑海”中的直观影像。所以,计算机为了能显示文字,我们就必须让计算机能够知道文字的影像,所以出现了字体,确切地说是字体文件,字体文件中包含了文字如何被绘制的信息,关于字体,参考

    字体一般来说需要包含两个要素:字符的图像信息和字符编码到这些图像信息的映射。

    字体的主要功能是将字符的编码转换为一个图片用以显示在屏幕或者用户界面上。从编码到字符的映射有很多中情况:多个编码映射为一个图像:(比如fi),一个编码映射到多个图像,但最常见的还是一个编码一个图像。

    常见的字体有两大类,一类称为位图字体(或者点阵字体),这类字体一般需要用一个二值(0-1)矩阵来表示一个符号,0-1矩阵信息将在屏幕上转换为黑白图像,这样的字体包括bdf,pcf,fnt,hbf等格式;第二类称为矢量字体(outline font),这类字体中每一个符号是通过数学曲线来描述的,字体中包含了符号边界上的关键点,连线的导数信息等,字体的渲染引擎通过读取这些数学曲线,然后进行一定的数学运算来进行渲染。这类字体的好处是字体可以无限放大而不产生锯齿,使用于高质量的打印和屏幕显示。矢量字体主要包括Type1和 True-Type等几类,其中Type1和True-Type比较可以从如下链接查看,简言之,True-Type使用了二次B样条(quadratic Bézier spline)而Type1使用了三次B样条曲线(cubic Bézier spline)来描述符号边界,因而TrueType的数学相对简单,易于hinting。

    上面一段文字来自:什么是字体

    3. 现在我们将字体文件保存到计算机中,就解决了计算机没有大脑来记忆文字影像的问题,第二个问题又出来了,我们写信是不仅仅是在画文字,同时我们是将有实际语义的文字组成词语,句子,段落从而来实现表达特定的含义:例如,你好(问候语)等等。也就说我们是按照文字的语义规则将文字组合起来进行交流。同样的,文字的语义规则也是我们通过从小的学习在脑海中的记忆而来的,例如:看到“香”这个字我们的脑海中立刻就想到许多美味佳肴,实际上这就是“香”的语义。但是计算机没有办法记忆文字的语义,呵呵实际上计算机也没必要知道文字的语义---------因为使用计算机的是具有记忆功能的人类。于是当我想描述一顿美味佳肴时我就在脑海中想,哪个字合适呢?通过语义在记忆中搜索,我找到了这个“香”字。同时我们也解决了计算机“记忆”字形的问题------计算机中已经有字体文件存在了,自然这个“香”字的影像也是有的。于是我大声命令计算机:“嗨,给我在屏幕上显示那个字体文件中存储的‘香’字”。好吧,我错了,计算机怎么可能听懂我们人类的语言,计算机只能听懂它自己的专属语言---“0100010001001000”,对就是二进制代码,所以信息在计算机中必须二进制化才能够被计算机识别。那么如何将“嗨,给我在屏幕上显示那个字体文件中存储的‘香’字”二进制化,实际上就是将字体文件中的文字编号,通过编号来索引文字不久可以了吗。例如“香”的编号是“1010010101”那么我们计算机的屏幕显示驱动程序在计算机中存储的字体文件中找到编号为“1010010101”的字形,然后画在屏幕上,就实现了正确地语义表达。所以我们不仅仅要存储文字的形象,还要将文字进行编号,实际上这个编号就是字符的编码。字符的编码和字体文件中字体的形象之间有了一一对应的关系,当我们要再屏幕上显示某个字符时告诉计算机字符的编码就可以了。计算机的图像渲染引擎就会将我们所需要的字体正确地显示。

    4. 现在又出来了一个字符编码的问题,好吧现在来对字符进行编码,其方法如下:

    (1)将新华字典中出现的第一个汉字的编码为”0x0000”

    (2)第二个汉字的编码为”0x0001”

    (3)这一依次类推,直到新华字典中的最后一个汉字。

    这样实现了一一对应是没有问题的,但是,如果计算机与计算机中的编码方案如果不同的话就会出现问题,假如:按照我的规则,“你”对应“0x3012”,“好”对应“0x1203”,那么我将“0x3012 0x1203”保存成一个文件,发送给另一个计算机用户,但是他的编码系统和我的不一样,那么当他打开这个文件时就会文字渲染器安装这个索引找到的字形就会出现问题,例如它找到了这两个字“瑟个”,于是另一个计算机用户就无法知道我想表达什么意思。所以为了计算机之间能够通过文件正确地交换信息,我们必须做到两个统一:第一个是:不同的计算机中安装的字体文件必须相同,这个我们可以做到,因为字体文件不是个人可以造的出来的。第二个是:字体文件中的字形索引也就是字符的编码必须相同。这个也可以做到。于是乎就出现的字符编码------例如GB2312,GBK, BIG5, utf-8等等,这些所谓的编码实际上就是公认的字体文件中字形索引方案而已。

    5. 再说说字符集,中文,希腊文等等其字形与编码的对应,这种对应所形成集合就是相应的字符集。

    6. 其实出现不同的编码方案,与文字在在计算机显示是没有关系的。想以下,再还没有出现国际互联网时,只要我们有中文的编码方案就行了例如GB2312,因为我们只使用中文。同时文件也不回传输到其他国家的计算机中。但是国际互联网的出现,迫切的需要不同国家不同语言文字的交流,如果没有适合的编码方案,那么就会出现上面提到的问题-----实际也就是乱码问题。所以就出现了可以包含多国文字的编码方案例如BIG5,亚洲地区的文字都包括了,所以中日韩交流就没有问题了。于是UNICODE…

    UTF-8,UTF-16等等就有了,自然而然.

    7. 为什么会有UTF-8,UTF-16,不说了,网络带宽,存储大小等这些因素嘛。

    8. 位图字体 矢量字体 光栅字体实际就是字体文件如何保存文字形象的方法,没有什么特别的。

    (1)位图字体,点阵字体,光栅字体:

    点阵字体是把每一个字符都分成16×16或24×24个点,然后用每个点的虚实来表示字符的轮廓。
    点阵字体优点是显示速度快,不像矢量字体需要计算;其最大的缺点是不能放大,一旦放大后就会发现文字边缘的锯齿。

    点阵字体也叫位图字体,其中每个字形都以一组二维像素信息表示。这种文字显示方式于较早前的电脑系统(例如未有图形接口时的 DOS 操作系统)被普遍采用。

    存储为位图的字体。光栅字体是为特定打印机设计的,有特定的大小和分辨率,而且不能缩放或旋转。如果打印机不支持光栅字体,就不会打印这些字体。五种光栅字体分别为 Courier、MS Sans Serif、MS Serif、Small 和 Symbol。光栅字体也被称为位图字体。

    (2)矢量字体

    矢量字库保存的是对每一个汉字的描述信息,比如一个笔划的起始、终止坐标,半径、弧度等等。在显示、打印这一类字库时,要经过一系列的数学运算才能输出结果,但是这一类字库保存的汉字理论上可以被无限地放大,笔划轮廓仍然能保持圆滑,打印时使用的字库均为此类字库。目前主流的矢量字体格式有Type1 、 TrueType、OpenType。矢量字体通常使用贝塞尔曲线,绘图指令和数学公式进行绘制。这样可以在对字体进行任意缩放的时候保持字体边缘依然光滑,字体色素不会丢失。

    关于字体文件结构的文章:TTF字体文件结构

  • 相关阅读:
    虚拟机的类加载机制
    数组
    Intellij快捷键
    Wireshark过滤器语法设置
    Git命令(转)
    Git命令
    字节码指令简介(转)
    Java异常了解
    Class类文件的结构
    垃圾收集器与内存分配策略(六)之内存分配与回收策略
  • 原文地址:https://www.cnblogs.com/a-ray-of-sunshine/p/3470872.html
Copyright © 2011-2022 走看看