了解术语 - 字符编码、字体、字形

3
我正在努力理解这些内容,以便能够有效地在工作中国际化项目。我刚刚开始,并且非常想知道您的专业知识是否正确理解了这些概念。到目前为止,以下是我从网络上收集到的简化版本(供我理解):
字符编码 -> 一组规则,告诉操作系统如何存储字符。例如,ISO8859-1、MSWIN1252、UTF-8、UCS-2、UTF-16。这些规则也称为代码页/字符集,它将单个字符映射到数字。显然,Unicode 处理方式与其他方式略有不同。即,它将代码点直接映射到抽象的“字符”,而不是直接映射到字形。[http://www.joelonsoftware.com/articles/Unicode.html]
字体 -> 这些是字符编码的实现。它们是不同格式的文件(True Type、Open Type、Post Script),包含每个字符在编码中到数字的映射。
字形 -> 这些是存储在字体文件中的字符的视觉表示。
基于以上理解,我有以下问题,

1) 操作系统是否需要单独安装编码才能理解它?或者安装支持编码的字体就足够了?使用网络协议TCP与编码类比是否合适,因为它只是一组规则。(当然这也引出了一个问题,如果我不安装它们,操作系统如何理解这些网络协议呢 :-p)

2) 字体是否总是具有完整的代码页实现,还是只有部分实现?有没有工具可以用来查看字体中的每个字符(.TTF文件?)[Windows字体查看器只显示字体样式,但不提供有关字体文件中字符列表的信息]

3) 字体文件是否支持多种编码?有没有办法知道字体支持哪些编码?

非常抱歉我问了太多问题,但我已经考虑了一段时间,并且找不到任何简单易懂的网站来帮助我理解这些内容。任何有关了解这些内容的帮助/链接都将不胜感激。先谢谢了。


1
只是出于好奇:需要这样深入的知识的项目是什么样的?你在写操作系统吗?还是全新的GDI?对于常规项目,你应该知道可以将几乎任何东西转换为Unicode,并将其用作默认字符编码。当然,大多数字体仅为某些Unicode类别定义了字形,因此了解一些有关字体回退的知识也不会有害。无论如何,你可能不应该重复造轮子,所以我想知道你在做什么... - Paweł Dyda
话虽如此,我必须声明你的问题不适合在Stack Overflow上提问,因为它与编程无关(不涉及任何代码片段)。而且很遗憾,这个问题太过广泛,没有简短的答案(人们可以写一本书来讨论这个话题)。如果你真的想深入了解这个问题,你需要克服巨大的难关。你必须掌握不同的书写系统,根据上下文改变字符表示,Ruby字符,字距调整,提示等等(没有特定的顺序)。 - Paweł Dyda
@Pawel Dyda:这只是一份需要国际化支持的现有遗留Java应用程序。但我对这个东西很好奇。如果范围太广,您可以提供文章/书籍链接,以便我从中学习吗?版主,请将其移动到适当的论坛。 - toddlermenot
1
这个问题实际上是一系列问题,大部分问题都涉及概念和基础知识,而不是关于编程技术的技术性问题。这些问题很重要、有趣,但最好在书籍、文章、课程和讨论论坛中进行处理。例如,请参阅http://www.unicode.org/resources/列出的资源。 - Jukka K. Korpela
3个回答

2
显然,Unicode 对此的处�方��其他编�有所��。�,它并�直�将数字(代�点)映射到字形,而是将代�点映射到一个抽象的“字符�,该字符�能由��的字形表示。
在 Unicode 字符编�模�中,有 4 个级别:
- 抽象字符集(ACR)——�进行编�的字符集。 - 编�字符集(CCS)——�字符到整数代�点之间的一对一映射。 - 字符编�形�(CEF)——�代�点到一系列固定宽度的代��元之间的映射。 - 字符编�方案(CES)——�代��元到�列化的字节�列之间的映射。
例如,字符 � 在 Unicode CCS 中用代�点 U+1D11E 表示,在 UTF-16 CEF 中用两个代��元 D834 DD1E 表示,在 UTF-16LE CES 中用四个字节 34 D8 1E DD 表示。

在大多数旧编码方式中,如US-ASCII,CEF和CES是微不足道的:每个字符由表示其ASCII码的单个字节直接表示。

1)为了让操作系统理解编码,它应该单独安装吗?

操作系统不必理解编码。您完全可以在应用程序级别使用第三方编码库(如ICUGNU libiconv)在您的编码和操作系统的本地编码之间进行转换。

2)字体是否总是具有代码页的完整实现,还是只有部分实现?

在7位(128个字符)和8位(256个字符)编码的时代,字体通常包括整个代码页的字形。今天,在字体中包括Unicode的所有100,000多个分配的字符并不常见。


2
如果您想了解更多,我当然可以为您指引一些资源:
Unicode、书写系统等方面的知识。
最好的信息来源可能是Jukka所著的这本书: Unicode Explained 如果您点击链接,还会发现这些书: CJKV Information Processing - 详细介绍了中文、日文、韩文和越南文,但对我来说阅读起来很困难。

输入图像描述
字体和编码 - 我个人没有读过这本书,所以我不能告诉你它是否好。看起来与主题相关。

国际化

如果您想学习有关 i18n 的知识,我可以提供无数资源。但让我们从一本书开始,它将为您节省大量时间(您知道您不可能一夜之间成为 i18n 专家):

开发国际软件
开发国际软件 - 它可能已经有8年了,但它仍然值得您花费的每一分钱。也许编程示例涉及 Windows(C++和.Net),但 i18n 和 L10n 知识确实存在。我的一个同事曾经说过,它为他节省了约2年的学习时间。据我所知,他没有夸张。

你可能会对这个主题上的一些博客或网站感兴趣:

Java国际化

恐怕我不知道太多关于这个主题的最新资源(公开可用的)。我所知道的唯一现有资源是Java国际化指南。不幸的是,它相当不完整。

JavaScript国际化

如果您正在开发Web应用程序,可能还需要与js相关的i18n内容。不幸的是,支持相当有限,但有一些库可帮助解决问题。最值得注意的例子是Dojo ToolkitGlobalize
前者有点重,虽然支持i18n的许多方面,后者则轻量级,但遗憾的是很多东西都缺失了。如果您选择使用Globalize,您可能会对最新的Jukka的书感兴趣:

Going Global with JavaScript & Globalize.js
Going Global with JavaScript & Globalize.js - 我已经阅读过这本书,并且可以告诉您,它非常好。虽然它没有涵盖您最初询问的主题,但仍然值得阅读,甚至包括如何使用Globalize的实际示例。


1

我会为你提供简短的答案。

  1. 通常不是操作系统支持编码,而是应用程序。编码用于将字节流转换为字符列表。例如,在C#中读取UTF-8字符串将自动使其成为UTF-16,如果您告诉它将其视为字符串。
    无论使用什么编码,C#都会在内部使用UTF-16,当您想要从外来编码打印字符串时,它将首先将其转换为UTF-16,然后查找字符表(字体)中对应的字符并显示字形。
  2. 我不记得曾经看到过完整的字体。我也没有太多处理字体的经验,所以我不能回答这个问题。
  3. 这个问题的答案在第1点中,但简要概括一下:字体通常是与编码无关的,这意味着只要系统可以将输入编码转换为字体编码,您就没问题。

奖励答案:“关于‘操作系统如何理解它不知道的网络协议?’:再次强调,处理这些协议的并不是操作系统,而是应用程序。只要操作系统知道在哪里重定向流量(即应用程序),它实际上并不需要关心协议。低层协议通常确实需要安装,以使操作系统知道应该发送数据到哪里。

此答案基于我的编码理解,如果有错误,请纠正我!


不是应用程序支持字符编码,而是某些SDK。它是操作系统的一部分吗?这取决于情况。Win32肯定是Windows的组成部分。一些服务,如输入法、GDI+、字体缓存等也是Windows操作系统的一部分。相比之下,在Linux上,这些类型的服务通常是X Windows或Windows Manager的一部分,尽管有些库也是独立的(以Pango为例)。这很复杂 ;) - Paweł Dyda

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接