使用特定的字符编码时,如何确定显示什么字体符号?

使用特定的字符编码时,如何确定显示什么字体符号?

我正在尝试了解文本在屏幕上显示的完整过程。为了简单起见,我使用单字节编码(不使用 Unicode)。

我的磁盘上有一系列字节,每个字节的值都在 0 到 255 之间。然后我可以告诉我的计算机程序应该使用哪种字符编码来显示这些字节。我可以使用 ISO-8859-1,例如,值为 0xA4 的字节是带有点的圆圈 (¤)。或者我可以切换到 ISO-8859-15,然后我的值为 0xA4 的字节被定义为欧元符号 (€)。

这一切仍然很容易理解。但在更改字符编码的同时,我还可以更改字体来定义符号的确切形状。现在,字体可以与全部字符编码。因此,字体应该同时包含两个符号:¤ 和 €。

因此,在我的屏幕上获取文本的步骤显然是:

  1. 串行读取字节序列
  2. 使用当前字节的数值查找字符编码表
  3. 使用 [something] 在字体文件中查找以获取步骤 2 中找到的符号的确切形状
  4. 按照字体文件中的定义绘制符号

在步骤 3 中,用于将字符编码映射到字体的“东西”是什么?字体文件是否依赖于字符编码?那么,字体是否有一些内置的“双开关”机制,其工作原理类似于(伪代码)

get_symbol(code, encoding) {
  switch code{
    case 0xA4: switch(encoding) {
      case 'ISO-8859-1' : return '¤';
      case 'ISO-8859-15': return '€';
    }
  }
}

如何从给定的字节序列和给定的字符编码获取字体中的实际符号的详细信息?如何映射才能始终给出正确的符号?

答案1

字体文件旨在显示特定编码。使用给定字体的程序必须假设给n定编码中的值是通过渲染相应的字形编号来显示的n

字体文件不需要包含给定字符编码的所有可能值的字形(对于 Unicode,字体很少会覆盖整个范围),也不需要从编码的第一个值开始(通常会省略控制字符)。有不同的文件格式方案用于指定起点、终点和省略的字形,这些方案用于保持字体文件大小易于管理。

从给出的示例来看,原作者很可能使用 X Window 系统。使用的文件格式不止一种,相应的访问方式也不同。主要有交联聚乙烯醇(较旧)和字体配置(较新)。对于其他系统(Microsoft Windows),使用其他 API(LOGFONT结构是一个很好的起点)。OSX 是另一个例子,它有自己的 API(核心文本)。

当然,这些是针对图形界面的。字体的适用范围比这更广。例如,Linux 和 BSD 允许指定不同的控制台字体 — 除了编码之外,它们还会限制可用的字形数量。以下是一些有用的链接:

答案2

绘制文本的应用程序在其使用的文本绘制 API 中指定字体,如果未指定,则使用系统默认字体。

基于 Unicode 的文本绘制系统通常具有字体替换算法,如果指定的字体没有所请求的字形,则该算法会查找包含特定字形的字体。但是,Unicode 之前的系统通常无法绘制字形或绘制“缺失字形”字形。即使基于 Unicode 的系统有时也会绘制“缺失字形”符号。

相关内容