【问题标题】:Is UTF-8 an encoding or a character set?UTF-8 是编码还是字符集?
【发布时间】: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


    【解决方案1】:

    UTF-8 是编码还是字符集?

    UTF-8 是一种编码,该术语在定义它的 RFC 中使用,下面引用。


    我经常看到术语“编码”和“字符集”互换使用

    在 Unicode 之前,如果您想使用西里尔字母或希腊字母等字母†,您需要使用仅编码为该字母表中字符的编码。因此,encodingcharset 这两个术语经常混为一谈,但它们的含义不同。

    现在,Unicode 通常是您唯一需要担心的字符集,因为它包含您必须处理的大多数书面语言的字符,克林贡语除外。

    † - 字母表,一种*字符集*,其中字符直接对应于口语中的声音。

    字符集是从代码单元(整数)到书面语言中的字符、符号、字形或其他标记的映射。 Unicode 是一个将 21b 整数映射到 unicode 代码点的字符集。 Unicode 联盟的glossary 是这样描述的:

    Unicode

    1. 用于书写世界上所有语言的字符的数字表示标准。 Unicode 提供了一种统一的方式来存储、搜索和交换任何语言的文本。它被所有现代计算机使用,并且是在 Internet 上处理文本的基础。 Unicode 由 Unicode 联盟开发和维护:http://www.unicode.org
    2. 适用于由 Unicode 联盟开发和维护的软件国际化和本地化标准的标签。

    编码是从字符串到字符串的映射。 UTF-8 是一种将字节字符串(8b 整数)映射到代码点字符串(21b 整数)的编码。 Unicode 联盟将其称为"character encoding scheme",并在RFC 3629 中定义。

    然而,最初提议的 UCS 编码是 与许多当前的应用程序和协议不兼容,这 导致了 UTF-8 的发展

    【讨论】:

    • 难道 [charset 和 encoding 之间的区别] 甚至在 unicode 之前就适用了吗?例如字符集 JIS X 0208 被 EUC-JP 和 Shift-Jis 编码不同
    • @Esailija,是的,但是当有许多与编码相关联的字符集时,人们经常以一种使没有单个相应编码的字符集似乎是规则的例外的方式接触它们,而不是而不是被介绍给两个明显不同的事物,每个事物都需要自己的术语。
    • 是的,“字符集”和“字符集”只是被广泛误用于指代编码。特别是,奇怪的是,在 MIME 和相关标准中。
    【解决方案2】:

    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' 开始的事实。

    【讨论】:

    • 更正:Tengwar 和 Klingon 目前没有分配给它们的 Unicode 代码点。两者确实在不同时间提出过,但是这两个提案都没有国家标准机构或行业参与者支持,以提供必要的委员会口号。
    【解决方案3】:

    Unicode 标准将其称为编码形式编码方案。 Unicode 有一个单一的字符集(称为 Unicode 字符集,或通用字符集),所有的 UTF编码形式编码方案都可以对所有字符进行编码那一套。

    与许多其他术语一样,程序员似乎倾向于到处乱用术语,这只是另一个例子。

    【讨论】:

      【解决方案4】:

      UTF-8 是一种编码。然而,编码通常被称为字符集,因此许多协议使用参数名称charset 作为指定字符编码的参数。因此,charset 只是一个标识符。

      【讨论】:

        【解决方案5】:

        从所有可能的来源来看,UTF-8 被命名为 encoding,而不是 charset,句号。

        然而它是由 Unicode 标准定义的,主要用于编码 Unicode 字符集。只需检查 UTF 首字母缩写词的含义:Unicode 转换格式。它甚至可以向后兼容一些以前的字符集,如 ASCII。所以从实际的角度来看,使用 UTF-8 来编码除 Unicode 以外的字符集是非常不寻常的。

        这可能是在某些情况下不准确地使用 UTF-8 作为字符集的根源。

        【讨论】:

          猜你喜欢
          • 2015-01-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-09-07
          • 1970-01-01
          • 1970-01-01
          • 2012-03-24
          • 2013-02-17
          相关资源
          最近更新 更多