“编码”,“字符集”和“代码页”之间有什么区别?

时间:2010-08-09 15:17:54

标签: encoding codepages

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

我读过Spolsky's article,但我还不清楚,因为这三个词可以互换使用 - 即使在那篇文章中也是如此。我想其中至少有两个人在谈论同样的事情。

我怀疑很高比例的开发人员每天都会通过这些东西。我不想再成为那些开发者之一了。

5 个答案:

答案 0 :(得分:33)

'字符集'就是它所说的:一个正确指定的不同字符列表。

'encoding'是字符集(今天通常是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 “)。]

答案 1 :(得分:6)

字符集是一组字符,即&#34;字形&#34;即代表通信单元的视觉符号。字母a是一个字形,因此(欧元符号)。字符集通常将整数(代码点)映射到每个字符,但它是指示字符的二进制表示的编码。

我是一名红宝石程序员,所以这里有一些例子可以帮助您理解这些概念。

这揭示了Unicode如何将代码点映射到字符,而不是如何存储每个字节。 (ruby 1.9默认为Unicode字符串。)

>> 'a'.codepoints.to_a
=> [97]
>> '€'.codepoints.to_a
=> [8364]

以下显示UTF-8编码如何将每个字符存储为字节(在base-10中为0到255)。 (Ruby 1.9&#s的默认编码是UTF-8。)由于8364(基数10)太大而无法放入一个字节,因此UTF-8有一个特定的策略可以将其分成多个字节。维基百科显示了UTF-8编码算法,如果你想深入研究实现。

>> 'a'.bytes.to_a
=> [97]
>> '€'.bytes.to_a
=> [226, 130, 172]

这与ISO-8859-15字符集中的内容相同:

>> 'a'.encode('iso-8859-15').codepoints.to_a
=> [97]
>> '€'.encode('iso-8859-15').codepoints.to_a
=> [164]

ISO-8859-15编码:

>> 'a'.encode('iso-8859-15').bytes.to_a
=> [97]
>> '€'.encode('iso-8859-15').bytes.to_a
=> [164]

请注意,ISO-8859-15代码点与字节表示匹配。

这是一篇可能有用的博客文章:http://blog.grayproductions.net/articles/what_is_a_character_encoding。如果您不想过于特定于红宝石,则参赛作品1至3是好的。

答案 2 :(得分:5)

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

答案 3 :(得分:4)

我认为乔尔的文章非常适合 - 这是字符集和存储技术发展背后的历史所带来的。

FWIW,在我过于简单的观点中

  • 字符集(ASCII,EBCDIC,UNICODE)将是字符的数字表示,与存储注意事项无关
  • 编码与文件,线路等字符,ANSI,UTF-7,UTF-8等有效存储有关。
  • 当需要添加新字符(不想增加存储容量)意味着(某些)字符只能在代码页的附加上下文中可知时,代码页将成为“kluge”。

恕我直言维基百科目前没有帮助将code page定义为“字符编码的另一个名称” 并将'字符集'重定向到'character encoding'

答案 4 :(得分:2)

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