理解术语 - 字符编码,字体,字形

时间:2011-12-23 18:02:54

标签: unicode encoding fonts internationalization globalization

我正在努力了解这些内容,以便我可以有效地在工作中实现国际化项目。我刚开始并且非常希望从您的专业知识中了解我是否理解这些概念是正确的。到目前为止,这是我从网络上收集的内容的简化版本(我的理解):

字符编码 - >告诉操作系统如何存储字符的规则集。例如,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)字体文件是否支持多种编码?有没有办法知道字体支持哪些编码?

我为提出太多问题而道歉,但我已经在脑海中留了一段时间,我找不到任何足够简单易懂的网站。任何有助于理解这些东西的帮助/链接都是非常受欢迎的。提前谢谢。

3 个答案:

答案 0 :(得分:2)

  

显然unicode处理这一点与其他处理方式略有不同。即,   它不是从数字(代码点)到字形的直接映射   将代码点映射到可能是抽象的“字符”   由不同的字形代表。

Unicode Character Encoding Model中,有4个级别:

  • 抽象角色保留曲目(ACR) - 要编码的字符集。
  • 编码字符集(CCS) - 从字符到整数代码点的一对一映射
  • 字符编码表单(CEF) - 从代码点到固定宽度代码单元序列的映射。
  • 字符编码方案(CES) - 从代码单元到序列化字节序列的映射。

例如,字符?由Unicode CCS中的代码点U + 1D11E,UTF-16 CEF中的两个代码单元D834 DD1E以及中的四个字节34 D8 1E DD表示。 UTF-16LE CES。

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

  

1)要使操作系统了解编码,是否应该安装   分别?

操作系统没有来理解编码。您可以完全免费使用第三方编码库(如ICUGNU libiconv)在应用程序级别转换您的编码和操作系统的本机编码。

  

2)字体是否始终具有代码页的完整实现或只是其中的一部分?

在7位(128个字符)和8位(256个字符)编码的日子里,字体通常包含整个代码页的字形。今天常见的字体包含Unicode中所有超过100,000个分配的字符。

答案 1 :(得分:2)

如果您想了解更多信息,我当然可以为您指出一些资源:

Unicode,编写系统等

Jukka可能是本书的最佳信息来源:

enter image description here
Unicode Explained

如果您要关注该链接,您还会找到这些书籍:

enter image description here
CJKV Information Processing - 详细介绍中文,日文,韩文和越南文,但对我而言似乎很难阅读。

enter image description here
Fonts & Encodings - 我个人还没看过这本书,所以我不能告诉你它是否好。似乎是主题。

国际

如果你想了解i18n,我可以提到无数的资源。但是,让我们从书中开始,这将节省你很多时间(你不会在一夜之间成为我的专家,你知道):

Developing International Software
Developing International Software - 它可能已经8岁了,但这仍然值得你花费的每一分钱。也许编程示例与Windows(C ++和.Net)有关,但i18n和L10n知识确实存在。我的一位同事说,一旦它为他节省了大约2年的学习时间。据我所知,他并没有夸大其词。

您可能对以下主题的某些博客或网站感兴趣:

Java国际化

我担心我不知道有关该主题的许多最新资源(即可公开获得的资源)。我所知道的唯一当前资源是Java Internationalization trail。不幸的是,它还不完整。

JavaScript国际化

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

Going Global with JavaScript & Globalize.js
Going Global with JavaScript & Globalize.js - 我读过这篇文章,据我所知,这很棒。它不包括您最初要求的主题,但仍然值得一读,即使是关于如何使用Globalize的动手实例。

答案 2 :(得分:1)

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

  1. 通常不支持编码的操作系统,而是应用程序。编码用于将字节流转换为字符列表。例如,在C#中读取UTF-8字符串会自动将其设为UTF-16,如果您告诉它将其视为字符串。
    无论你使用什么编码,C#都会在内部简单地使用UTF-16,例如,当你想要打印一个来自外部编码的字符串时,它会首先将它转换为UTF-16,然后查找字符表(字体)中的相应字符并显示字形。
  2. 我不记得曾见过一个完整的字体。我也没有太多使用字体的经验,所以我不能给你一个答案。
  3. 这个问题的答案在#1中,但是简短的总结:字体通常与编码无关,这意味着只要系统可以将输入编码转换为字体编码就可以了。
  4. 奖励回答:关于“操作系统如何理解它不知道的网络协议?”:再次,它不是处理它们的操作系统而是应用程序。只要操作系统知道在哪里重定向流量(哪个应用程序),它就不需要关心协议。通常必须安装低级协议,以允许操作系统知道将数据发送到何处。

    这个答案是基于我对编码的理解,这可能是错误的。如果是这样的话,请纠正我!