Dea*_*ane 25 encoding codepages
我真的想用这些东西变得更好.我对这样的国际化概念非常有用,但我需要更好地了解它背后的理论.
我读过Spolsky的文章,但我仍然不清楚,因为这三个术语可以互换使用 - 即使在那篇文章中也是如此.我想其中至少有两个人在谈论同样的事情.
我怀疑很高比例的开发人员每天都会通过这些东西.我不想再成为那些开发者之一了.
bob*_*nce 36
"字符集"就是它所说的:一个正确指定的不同字符列表.
"编码"是字符集(今天通常是Unicode)和字符的(通常是基于字节的)技术表示之间的映射.
UTF-8是一种编码,但不是字符集.它是Unicode字符集(*)的编码.
之所以产生混淆,是因为大多数其他众所周知的编码(例如:ISO-8859-1)都是作为单独的字符集开始的.然后,当Unicode作为大多数这些字符集的超集出现时,可以将它们视为相同(Unicode)字符集的不同(但部分)编码,而不仅仅是孤立的字符集.以这种方式查看它们允许您通过Unicode轻松地在它们之间进行转换,如果它们仅仅是孤立的字符集,这是不可能的.但是将它们称为字符集仍然是有意义的,因此可以使用任一术语.
"代码页"是源于IBM的术语,它选择显示哪组符号.该术语继续被DOS和Windows使用,直到支持Unicode的Windows,它只是作为带编号标识符的编码.虽然编号的"代码页"是一个本质上不限于Microsoft的想法,但今天这个术语几乎总是指Windows所知的编码.
当谈论代码页<某个数字>时,人们通常会谈论特定于Windows的编码,这与标准机构设计的编码不同.例如,代码页28591通常不会在该名称下引用,而只是"ISO-8859-1".基于ISO-8859-1的Windows特定的西欧编码(用一些额外的字符代替它的一些控制代码)通常被称为"代码页1252".
[*:所有的UTF都是编码而不是字符集,但这种事情并不是Unicode独有的.例如,日本标准JIS X 0208为它定义了一个字符集和两个不同的字节编码:有点令人不愉快的基于高字节的编码('Shift-JIS'),以及基于逃避切换的深度编码('JIS ").]
字符集就是一组可以使用的字符.
这些字符中的每一个都映射到一个称为代码点的整数.
这些代码点在内存中的表示方式是编码.编码只是将代码点(U + 0041 - 字符'A'的Unicode代码点)转换为原始数据(位和字节)的方法.
字符集是一组字符,即"字形",即表示通信单元的视觉符号.这封信a是一个字形,所以是€(欧元符号).字符集通常将整数(代码点)映射到每个字符,但它是指示字符的二进制表示的编码.
我是一名红宝石程序员,所以这里有一些例子可以帮助你理解这些概念.
这揭示了Unicode如何将代码点映射到字符,而不是如何存储每个字节.(ruby 1.9默认为Unicode字符串.)
>> 'a'.codepoints.to_a
=> [97]
>> '€'.codepoints.to_a
=> [8364]
Run Code Online (Sandbox Code Playgroud)
以下显示了UTF-8编码如何将每个字符存储为字节(基数为10到255).(Ruby 1.9的默认编码是UTF-8.)由于8364(基数10)太大而无法容纳在一个字节中,因此UTF-8具有将其分解为多个字节的特定策略.维基百科显示了UTF-8编码算法,如果您想深入研究实现.
>> 'a'.bytes.to_a
=> [97]
>> '€'.bytes.to_a
=> [226, 130, 172]
Run Code Online (Sandbox Code Playgroud)
这是ISO-8859-15字符集中的相同内容:
>> 'a'.encode('iso-8859-15').codepoints.to_a
=> [97]
>> '€'.encode('iso-8859-15').codepoints.to_a
=> [164]
Run Code Online (Sandbox Code Playgroud)
和ISO-8859-15编码:
>> 'a'.encode('iso-8859-15').bytes.to_a
=> [97]
>> '€'.encode('iso-8859-15').bytes.to_a
=> [164]
Run Code Online (Sandbox Code Playgroud)
请注意,ISO-8859-15代码点与字节表示匹配.
这是一篇可能有用的博客文章:http://blog.grayproductions.net/articles/what_is_a_character_encoding.如果您不想太特定于红宝石,则参赛作品1至3是好的.
我认为 Joel 的文章非常准确 - 正是字符集和存储演变背后的历史导致了这一点。
FWIW,在我过于简单化的观点中
恕我直言,维基百科目前并没有通过将代码页定义为“字符编码的另一个名称”并将“字符集”重定向到“字符编码”来帮助解决问题