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

J S*_*ith 9 unicode encoding character utf-8

我认为字符集的名称是"Unicode",而"UTF-8"是Unicode字符集的特定编码的名称,但我经常看到术语"编码"和"字符集"在引用时可互换使用到UTF-8.

例如,

<meta charset="UTF-8">
Run Code Online (Sandbox Code Playgroud)

VS

<?xml version="1.0" encoding="UTF-8" ?>
Run Code Online (Sandbox Code Playgroud)

Mik*_*uel 12

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

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


我经常看到术语"编码"和"字符集"可以互换使用

在Unicode之前,如果您想使用字母†如西里尔语或希腊语,则需要使用仅编码为该字母表中字符的编码.因此,术语编码字符集经常被混淆,但它们意味着不同的东西.

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

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


字符集是从代码单元(整数),以字符,符号,字形,或其他标记以书面语言的映射.Unicode是一个将21b整数映射到unicode代码点的字符集.Unicode Consortium的词汇表因此描述了它:

统一

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

编码是从字符串到字符串的映射.UTF-8是一种将字节串(8b整数)映射到代码点字符串(21b整数)的编码.Unicode Consortium将其称为"字符编码方案",它在RFC 3629中定义.

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


Nor*_*ray 8

UTF-8 是一种编码,从某种意义上说,它将抽象整数序列 \xe2\x80\x93编码为一组字节,这些un​​icode代码点表示抽象字符 \xe2\x80\x93 。(通过 unicode 眼镜,您可以说ISO-8859-1等“字符集”也是表驱动的“编码”,从某种意义上说,它将少量代码点编码为字节,但是这接近于滥用术语,并且可能没有多大帮助)。

\n\n

整数序列(在某种基本意义上)是“unicode 字符串”,但为了将它们保存在磁盘上或通过网络发送它们,您需要将它们编码为字节序列。UTF-8 是一种实现方式,UTF-16 是另一种方式:如果一个 unicode 字符串以两种不同的方式编码,则该字符串将表示为两个不同的字节流。

\n\n
\n\n

这里有多个很好的答案,但就在昨天,我花了一些时间试图将这个问题归结为最小的尺寸,所以这提供了一个重用该文本的好机会:

\n\n

我认为,Joel Spolsky 的文章《每个软件开发人员绝对必须了解 Unicode 和字符集的绝对最低限度(没有任何借口!)》非常好。之前(肯定)已经提到过这一点,但值得重复。但我认为这并不是完全最小的。

\n\n

有几次,当我不得不向同事解释“unicode”时,抽象 Unicode 代码点的概念成为了阐释的关键。我的成功解释的结构是这样的:

\n\n
    \n
  • Unicode 联盟(经过大量的痛苦和谈判)设法为大部分正在使用的字符提供了编号。这些数字(行话)称为“代码点”。

  • \n
  • “字母 A”有一个代码点,并且与字体无关。因此,\'A\' 和 \'a\' 具有不同的代码点,但罗马、粗体、斜体、衬线、无衬线(等等)是不区分的。例如,日语汉字、tengwar 和克林贡字符都有代码点(这引起了注意)。

  • \n
  • “unicode 字符串”(从概念上讲)是一个代码点序列。这是一个数学整数序列。询问这些是字节、2 字节还是 4 字节字是没有意义的;该序列与计算机无关。

  • \n
  • 但是,如果您想将该整数序列发送给某人,或者将其保存在计算机磁盘上,则必须执行一些操作来对其进行编码。您也可以在一张纸上写下数字序列,但现在让我们专门讨论计算机。如果你想在计算机上存储或发送它,你必须将这些整数转换为字节序列。有多个过程可以执行此操作,每个过程都被命名为“编码”。其中一种“编码”是 UTF-8。

  • \n
  • 当您“读取 Unicode 文件”时,您将从磁盘上的字节序列开始,概念上以整数序列结束。如果以某种方式指示“unicode 文件”以 UTF-8 进行编码,那么您必须使用RFC 3629中定义的算法对该字节序列进行解码以获取整数序列。对“unicode 字符串”的所有后续操作都是根据代码点序列定义的,并且它在磁盘上以“UTF-8”形式开始的事实被遗忘了。

  • \n
\n