36

我真的很想用这些东西变得更好。我对这样的国际化概念非常熟悉,但我需要更好地了解其背后的理论。

我读过Spolsky 的文章,但我仍然不清楚,因为这三个术语经常互换使用——即使在那篇文章中也是如此。我认为他们中至少有两个在谈论同一件事。

我怀疑有很大比例的开发人员每天都在摸索这些东西。我不想再成为那些开发人员中的一员了。

4

5 回答 5

47

“字符集”就是它所说的:正确指定的不同字符列表。

“编码”是字符集(通常是当今的 Unicode)和字符的(通常基于字节的)技术表示之间的映射。

UTF-8 是一种编码,但不是字符集。它是 Unicode 字符集 (*) 的编码。

之所以会出现这种混乱,是因为大多数其他众所周知的编码(例如:ISO-8859-1)都是作为单独的字符集开始的。然后,当 Unicode 作为大多数这些字符集的超集出现时,可以将它们视为相同 (Unicode) 字符集的不同(但部分)编码,而不仅仅是孤立的字符集。以这种方式查看它们可以让您轻松地通过 Unicode 在它们之间进行转换,如果它们只是孤立的字符集,这是不可能的。但是将它们称为字符集仍然是有意义的,因此可以使用任何一个术语。

“代码页”是一个源自 IBM 的术语,用于选择要显示的符号集。该术语继续被 DOS 和 Windows 使用,一直到支持 Unicode 的 Windows,它只是作为带有编号标识符的编码。虽然编号的“代码页”是一个并不局限于微软的想法,但今天这个术语几乎总是意味着 Windows 知道的编码。

当人们谈论代码页‹某个数字›时,通常是在谈论特定于 Windows 的编码,这与标准机构设计的编码不同。例如,代码页 28591 通常不会以该名称引用,而只是“ISO-8859-1”。基于 ISO-8859-1 的特定于 Windows 的西欧编码(用一些额外的字符替换了它的一些控制代码)通常称为“代码页 1252”。

[*:所有的 UTF 都是编码而不是字符集,但是这种东西并不是 Unicode 独有的。例如,日本标准 JIS X 0208 为它定义了一个字符集和两种不同的字节编码:有点令人不快的基于高字节的编码('Shift-JIS')和非常可怕的基于转义切换的编码('JIS ')。]

于 2010-08-09T15:42:59.663 回答
8

字符集就是这样,一组可以使用的字符。
这些字符中的每一个都映射到一个称为代码点的整数。
这些代码点在内存中的表示方式就是编码。编码只是一种将代码点(U+0041 - 字符“A”的 Unicode 代码点)转换为原始数据(位和字节)的方法。

于 2010-08-09T15:28:13.923 回答
7
于 2012-07-12T22:38:52.433 回答
5

我认为 Joel 的文章非常准确——正是字符集和存储演变背后的历史导致了这一点。

FWIW,在我看来过于简单化了

  • 字符集(ASCII、EBCDIC、UNICODE)将是字符的数字表示,与存储考虑无关
  • 编码将涉及字符、ANSI、UTF-7、UTF-8 等的有效存储,用于文件、网络等
  • 当需要添加新字符(不想增加存储容量)意味着(某些)字符只能在代码页的附加上下文中知道时,代码页将是所需的“kluge”。

恕我直言,维基百科目前没有通过将代码页定义为“字符编码的另一个名称”并将“字符集”重定向到“字符编码”来帮助解决问题

于 2010-08-09T15:55:46.453 回答
2

本书中关于 Unicode 的章节Advanced Perl Programming包含对编码、字符集和我遇到的其他 unicode 实体的最佳描述。不幸的是,我不认为它可以免费在线获得。

于 2010-08-09T15:28:21.063 回答