字符集和字符编码有什么区别?

10

字符集(Charsets)和字符编码(Character encoding)有什么区别? 当我说我在使用 utf-8 编码时, 我的字符集是什么? 它默认采用 Unicode 作为字符集吗?


可能是编码和字符集有什么区别?的重复问题。 - toto_tico
5个回答

4
UTF-8 是 Unicode 字符集的一种编码方式。因此,如果你使用 UTF-8,那么字符集就是 Unicode,但你不需要在任何地方单独指定它。Unicode 的另一个主要编码方式是 UTF-16,由于它包含零字节,因此不会被放入 8 位字节流中。如果你在一个字节序列中处理 Unicode,则它肯定被编码为 UTF-8。
除了 Unicode 外,字符集通常被认为有一个固定的编码方式,然后像字符集、charset、codepage、encoding 这样的术语经常可以互换使用,或者根据供应商而异。这种做法虽然草率,但并不会导致运行时问题。
我想唯一可能的例外情况是东亚语言:JIS 和 EUC 最初为同一字符集定义了多个编码方式,但在实践中,每个编码方式都被单独处理。

1
还有更多的例外情况:IBM037和IBM500与ISO-8859-1具有完全相同的字符集,但顺序完全不同。 - dan04
抱歉没有注意到,EBCDIC 是一个我很少考虑的完全不同的世界。即使你将 EBCDIC 和基于 ASCII 的编码混淆,你甚至会在英语文本中得到垃圾字符,并且必须立即修复它,而不是将其留作外国用户和 i18n 开发人员的定时炸弹。 - Joseph Boyle

3

字符集:定义每个字符对应的数字编码点(ASCII、JIS、Unicode)。

编码:定义数字编码点如何在物理上表示(UTF、UCS、ShiftJIS)。


2
根据Unicode术语
  • ACR:抽象字符集 = 要编码的字符集,例如某些字母表或符号集
  • CCS:编码字符集 = 从抽象字符集到非负整数集的映射
  • CEF:字符编码形式 = 从CCS的非负整数集到一些指定宽度的特定代码单元序列集的映射,如32位整数
  • CES:字符编码方案 = 从代码单元序列集(来自一个或多个CEF)到序列化字节序列的可逆转换
  • CM:字符映射 = 从抽象字符集的成员序列到在一个操作中跨越所有四个级别的序列化字节序列的映射
  • TES:传输编码语法 = 对编码数据的可逆变换,可能包含文本数据,也可能不包含

旧协议(如MIME)在实际上指的是“字符编码方案”时使用“charset”。最初,不同的字符编码被认为是独立的字符集,而不是Unicode的子集。


0

字符集定义了数字和字符之间的映射关系。几乎所有字符集都将65表示为A,并且在数字映射到127以下时一般都达成共识。但是当涉及到127以上的数字时,它们可能会有不同的标准。

有很多种字符集:

  • EBCDIC
  • 双字节字符集
  • ANSI
  • 不同的OEM字符集
  • Unicode,旨在创建一个包含地球上每个合理书写系统以及一些虚构系统(如克林贡语)的单一字符集。

当你说字符编码时,你谈论的是Unicode代码点(即字符)在内部存储的方式。

在UTF-8编码中,0-127的每个代码点都存储在一个字节中。只有128及以上的代码点才使用2、3甚至6个字节进行存储。
有一种叫做UTF-7的编码方式,它与UTF-8很像,但是保证高位始终为零。
还有数百种传统编码方式,只能正确存储某些代码点,并将所有其他代码点变成问号。一些英文文本的常见编码方式包括Windows-1252(西欧语言的Windows 9x标准)和ISO-8859-1,也称为Latin-1(对于任何西欧语言也很有用)。
UTF 7、8、16和32都具有存储任何代码点的良好性质。
这篇文章几乎完全基于Joel Spolsky关于Unicode的帖子:每个软件开发者绝对必须了解的有关Unicode和字符集的绝对最低限度。阅读它可以更好地理解。

-2

那么为什么XML中有两个属性呢? charsets和encoding - Neeraj
它们不是同义词。请查看其他答案。 - Mechanical snail

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接