Encoding 什么';“A”和“A”的区别是什么;“编码”;a「;字符集;及;代码页;?

Encoding 什么';“A”和“A”的区别是什么;“编码”;a「;字符集;及;代码页;?,encoding,codepages,Encoding,Codepages,我真的想用这些东西变得更好。我对这样的国际化概念非常熟悉,但我需要对其背后的理论有一个更好的背景 我已经读过了,但我仍然不清楚,因为这三个术语经常互换使用——即使在那篇文章中也是如此。我想至少有两个人在谈论同一件事 我怀疑有很高比例的开发人员每天都会在这些东西上游手好闲。我不想再成为那些开发者中的一员。字符集就是可以使用的字符集。 每个字符都映射到一个称为代码点的整数。 这些代码点在内存中的表示方式是编码。编码只是一种将代码点(U+0041-字符“a”的Unicode代码点)转换为原始数据(位和

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

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


我怀疑有很高比例的开发人员每天都会在这些东西上游手好闲。我不想再成为那些开发者中的一员。

字符集就是可以使用的字符集。
每个字符都映射到一个称为代码点的整数。

这些代码点在内存中的表示方式是编码。编码只是一种将代码点(U+0041-字符“a”的Unicode代码点)转换为原始数据(位和字节)的方法。

本书中有关Unicode的章节,包含了对编码、字符集和我遇到的Unicode其他实体的最佳描述。不幸的是,我不认为它在网上是免费的。

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

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

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

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

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

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


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

我认为Joel的文章非常贴切——正是字符集和存储发展背后的历史导致了这一点

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

  • 字符集(ASCII、EBCDIC、UNICODE)将是字符的数字表示,与存储考虑无关
  • 编码将涉及到文件、跨线等的字符、ANSI、UTF-7、UTF-8等的有效存储
  • 当需要添加新字符(而不想增加存储容量)意味着(某些)字符只能在代码页的附加上下文中知道时,代码页将是所需的“kluge”
IMHO Wikipedia目前将其定义为“字符编码的另一个名称”并没有任何帮助
将“字符集”重定向到

字符集是一组字符,即“字形”,即表示通信单元的视觉符号。字母
a
是一个字形,
(欧元符号)也是一个字形。字符集通常将整数(代码点)映射到每个字符,但编码决定了字符的二进制表示形式

我是一名ruby程序员,这里有一些例子可以帮助您理解这些概念

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

下面介绍了UTF-8编码如何将每个字符存储为字节(base-10中的0到255)。(Ruby 1.9的默认编码是UTF-8。)由于8364(以10为基数)太大,无法容纳一个字节,UTF-8有一个将其拆分为多个字节的特定策略。Wikipedia显示了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代码点与字节表示形式匹配


以下是一篇可能有用的博客文章:。如果您不想过于特定于ruby,条目1到条目3都很好。

我订阅了Safari。刚刚下载了这一章,谢谢。IMHO,没有这样的
ANSI
编码。“ANSI”这个名字用词不当。@nn0p是真的,尽管“ANSI”的使用在Microsoft文档、API甚至各种产品中非常普遍,有时很难知道界限在哪里。尽管如此,我还是写了一篇与SQLServer文档和元数据相关的文章,把ANSI、ISO-8859-1和Windows-1252都当成了最重要的工具
>> 'a'.encode('iso-8859-15').bytes.to_a
=> [97]
>> '€'.encode('iso-8859-15').bytes.to_a
=> [164]