【发布时间】:2013-02-20 01:58:30
【问题描述】:
我认为字符集的名称是“Unicode”,而“UTF-8”是 Unicode 字符集的特定编码的名称,但我经常看到使用的术语“编码”和“字符集”在提到 UTF-8 时可以互换。
例如,
<meta charset="UTF-8">
对
<?xml version="1.0" encoding="UTF-8" ?>
【问题讨论】:
标签: unicode encoding utf-8 character
我认为字符集的名称是“Unicode”,而“UTF-8”是 Unicode 字符集的特定编码的名称,但我经常看到使用的术语“编码”和“字符集”在提到 UTF-8 时可以互换。
例如,
<meta charset="UTF-8">
对
<?xml version="1.0" encoding="UTF-8" ?>
【问题讨论】:
标签: unicode encoding utf-8 character
UTF-8 是编码还是字符集?
UTF-8 是一种编码,该术语在定义它的 RFC 中使用,下面引用。
我经常看到术语“编码”和“字符集”互换使用
在 Unicode 之前,如果您想使用西里尔字母或希腊字母等字母†,您需要使用仅编码为该字母表中字符的编码。因此,encoding 和 charset 这两个术语经常混为一谈,但它们的含义不同。
现在,Unicode 通常是您唯一需要担心的字符集,因为它包含您必须处理的大多数书面语言的字符,克林贡语除外。
† - 字母表,一种*字符集*,其中字符直接对应于口语中的声音。字符集是从代码单元(整数)到书面语言中的字符、符号、字形或其他标记的映射。 Unicode 是一个将 21b 整数映射到 unicode 代码点的字符集。 Unicode 联盟的glossary 是这样描述的:
Unicode
- 用于书写世界上所有语言的字符的数字表示标准。 Unicode 提供了一种统一的方式来存储、搜索和交换任何语言的文本。它被所有现代计算机使用,并且是在 Internet 上处理文本的基础。 Unicode 由 Unicode 联盟开发和维护:http://www.unicode.org。
- 适用于由 Unicode 联盟开发和维护的软件国际化和本地化标准的标签。
编码是从字符串到字符串的映射。 UTF-8 是一种将字节字符串(8b 整数)映射到代码点字符串(21b 整数)的编码。 Unicode 联盟将其称为"character encoding scheme",并在RFC 3629 中定义。
然而,最初提议的 UCS 编码是 与许多当前的应用程序和协议不兼容,这 导致了 UTF-8 的发展
【讨论】:
UTF-8 是一种编码,从某种意义上说,它编码一个抽象整数序列 - 表示抽象字符的unicode 代码点 - 成一组字节。 (通过 unicode 眼镜,您可以说诸如 ISO-8859-1 之类的“字符集”也是表驱动的“编码”,因为它将少量代码点编码为字节,但这正在接近滥用术语,并且可能不是很有帮助)。
整数序列(在某种基本意义上)是“unicode 字符串”,但是为了将它们保存在磁盘上或通过网络发送它们,您需要将它们编码为字节序列。 UTF-8 是这样做的一种方式,UTF-16 是另一种方式:如果以两种不同的方式编码,一个 unicode 字符串将被表示为两个不同的字节流。
这里有多个很好的答案,但就在昨天,我花了一些时间试图将这个问题简化为最小的大小,所以这提供了一个重用该文本的好机会:
我认为,Joel Spolsky 在The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!) 上的文章相当不错。它(肯定)之前在这里提到过,但值得重复。不过,我认为这不是完全最小的。
有几次我不得不向同事解释“unicode”时,抽象 Unicode 代码点的概念成为照明的关键。我成功解释的结构是这样的:
Unicode 联盟(经过许多苦恼和协商)设法为大部分正在使用的字符提供了一个数字。这些数字(行话)称为“代码点”。
“字母 A”有一个代码点,它与字体无关。因此,“A”和“a”具有不同的代码点,但没有区分罗马、粗体、斜体、衬线、无衬线(等等)。日文汉字、腾格瓦和克林贡字符(例如)有代码点(这会引起注意)。
“unicode 字符串”(在概念上)是一个代码点序列。这是一个数学整数序列。询问这些是字节、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 作为字符集的根源。
【讨论】: