我认为字符集的名称是“Unicode”,而“UTF-8”是 Unicode 字符集的特定编码的名称,但我经常看到术语“编码”和“字符集”在引用时可以互换使用转为 UTF-8。
例如,
<meta charset="UTF-8">
对比
<?xml version="1.0" encoding="UTF-8" ?>
UTF-8 是编码还是字符集?
UTF-8 是一种编码,该术语在定义它的 RFC 中使用,下面引用。
我经常看到术语“编码”和“字符集”可以互换使用
在 Unicode 之前,如果您想使用西里尔文或希腊文之类的字母†,则需要使用仅对该字母中的字符进行编码的编码。因此,术语编码和字符集经常被混为一谈,但它们的含义不同。
但现在,Unicode 通常是您需要担心的唯一字符集,因为它包含您必须处理的大多数书面语言的字符,克林贡语除外。
† - 字母表,一种*字符集*,其中字符直接对应于口语中的声音。字符集是从代码单元(整数)到书面语言中的字符、符号、字形或其他标记的映射。Unicode 是一个将 21b 整数映射到 unicode 代码点的字符集。Unicode 联盟的词汇表是这样描述的:
统一码
- 用于书写世界上所有语言的字符的数字表示标准。Unicode 提供了一种统一的方式来存储、搜索和交换任何语言的文本。它被所有现代计算机使用,并且是在 Internet 上处理文本的基础。Unicode 由 Unicode 联盟开发和维护:http ://www.unicode.org 。
- 适用于由 Unicode 联盟开发和维护的软件国际化和本地化标准的标签。
编码是从字符串到字符串的映射。UTF-8 是一种将字节字符串(8b 整数)映射到代码点字符串(21b 整数)的编码。Unicode 联盟将其称为“字符编码方案”,并在RFC 3629中定义。
然而,最初提出的 UCS 编码与许多当前的应用程序和协议不兼容,这导致了 UTF-8 的发展
UTF-8 是一种编码,因为它将一系列抽象整数(表示抽象字符的unicode代码点)编码为一组字节。(通过 unicode 眼镜,您可以说诸如ISO-8859-1之类的“字符集”也是表驱动的“编码”,因为它将少量代码点编码为字节,但这正在接近滥用术语,可能不是很有帮助)。
整数序列(在某种基本意义上)是“unicode 字符串”,但是为了将它们保存在磁盘上或通过网络发送它们,您需要将它们编码为字节序列。UTF-8 是这样做的一种方式,UTF-16 是另一种方式:如果一个 unicode 字符串以两种不同的方式编码,它将被表示为两个不同的字节流。
这里有多个很好的答案,但就在昨天,我花了一些时间试图将这个问题简化为最小的大小,所以这提供了一个重用该文本的快乐机会:
我认为 Joel Spolsky 关于每个软件开发人员绝对、肯定必须了解 Unicode 和字符集(没有借口!)的绝对最小值的文章非常好。它(肯定)之前在这里提到过,但值得重复。不过,我认为这不是完全最小的。
有几次我不得不向同事解释“unicode”时,抽象 Unicode 代码点的概念成为了照明的关键。我成功解释的结构是这样的:
Unicode 联盟(经过许多苦恼和协商)设法为大部分正在使用的字符提供了一个数字。这些数字(行话)称为“代码点”。
'The Letter A' 有一个代码点,这与字体无关。因此,“A”和“a”具有不同的代码点,但没有区分罗马、粗体、斜体、衬线、无衬线(等等)。日文汉字、腾瓦尔和克林贡字符(例如)有代码点(这会引起注意)。
'unicode string' 是(概念上)一系列代码点。这是一个数学整数序列。询问这些是字节、2 字节还是 4 字节字是没有意义的;该序列与计算机无关。
但是,如果您想将该整数序列发送给某人,或将其保存在计算机磁盘上,则必须对其进行编码。您也可以在一张纸上写下数字序列,但现在让我们专注于计算机。如果您想在计算机上存储或发送它,您必须将这些整数转换为字节序列。有多个过程可以做到这一点,每个过程都被命名为“编码”。这些“编码”之一是 UTF-8。
当您“读取 Unicode 文件”时,您从磁盘上的字节序列开始,并且在概念上以整数序列结束。如果以某种方式指示“unicode 文件”以 UTF-8 编码,那么您必须使用RFC 3629中定义的算法对该字节序列进行解码以获得整数序列。'unicode string' 上的所有后续操作都是根据代码点序列定义的,并且忘记了它在磁盘上以 'UTF-8' 开始的事实。
Unicode 标准将其称为编码形式或编码方案。Unicode 有一组字符(称为 Unicode 字符集,或通用字符集),所有 UTF编码形式和编码方案都可以编码该集中的所有字符。
与许多其他术语一样,程序员似乎倾向于到处乱用术语,这只是另一个例子。
UTF-8 是一种编码。然而,编码通常称为字符集,因此许多协议使用参数名称charset
作为指定字符编码的参数。因此,charset
它只是一个标识符。
从所有可能的来源来看,UTF-8 都被命名为encoding,而不是charset。
然而,它是由 Unicode 标准定义的,主要用于编码 Unicode 字符集。只需检查 UTF 首字母缩写词的含义:Unicode转换格式。它甚至可以向后兼容一些以前的字符集,如 ASCII。因此,从实际的角度来看,使用 UTF-8 对 Unicode 以外的字符集进行编码是非常不寻常的。
这可能是在某些情况下不准确地将 UTF-8 用作字符集的根源。