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

时间:2013-03-05 15:29:02

标签: unicode encoding utf-8 character

我认为字符集的名称是“Unicode”,而“UTF-8”是Unicode字符集的特定编码的名称,但我经常看到使用术语“encoding”和“charset”在提到UTF-8时可以互换。

例如,

<meta charset="UTF-8">

VS

<?xml version="1.0" encoding="UTF-8" ?>

5 个答案:

答案 0 :(得分:12)

  

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

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


  

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

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

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

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


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

  

的Unicode

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

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

  

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

答案 1 :(得分:4)

UTF-8是一个编码,从某种意义上说它编码一系列抽象整数 - 表示抽象字符的unicode代码点 - 一组字节。 (通过unicode眼镜,你可以说一个&#39;字符集&#39;例如ISO-8859-1也是一个表驱动的编码&#39;,就像它编码一个小数字一样代码点作为字节,但这很容易滥用术语,可能不是很有帮助。)

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


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

我认为,乔尔·斯波尔斯基关于The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)的文章相当不错。它(肯定)之前已在此处提及,但需要重复。不过,我认为它并非完全微不足道。

有几次我不得不解释&#39; unicode&#39;对于同事来说,抽象的Unicode代码点的概念是关键的照明。我成功解释的结构是这样的:

  • Unicode联盟(有很多痛苦和谈判)设法为正在使用的大部分字符提供数字。这些数字是(行话),称为“#code;&#39;

  • &#39;字母A&#39;有一个代码点,这与字体无关。因此&#39; A&#39;和&#39; a&#39;有不同的代码点,但不区分罗马,粗体,斜体,衬线,无衬线(非常多)。日语汉字,tengwar和klingon字符(例如)有代码点(这引起了注意)。

  • A&#39; unicode string&#39;是(概念上)一系列代码点。这是一系列数学整数。询问这些是字节,2字节还是4字节字是没有意义的;该序列与计算机无关。

  • 但是,如果要将某个整数序列发送给某人,或将其保存在计算机磁盘上,则必须对其进行编码。你也可以在一张纸上写下数字序列,但此时我们要专注于计算机。如果要在计算机上存储或发送它,则必须将这些整数转换为字节序列。这样做有多种程序,每个程序都被命名为“编码”。其中一种编码&#39;是UTF-8。

  • 当您读取Unicode文件时,您将从磁盘上的一系列字节开始,并在概念上以一系列整数结束。如果&#39; unicode文件&#39;以某种方式表示以UTF-8编码,然后你必须使用RFC 3629中定义的算法解码该字节序列以获得整数序列。关于&#39; unicode字符串的所有后续操作&#39;根据代码点的顺序,以及它在磁盘上开始的事实来定义为UTF-8&#39;被遗忘了。

答案 2 :(得分:2)

Unicode标准将其称为编码格式编码方案。 Unicode有一组字符(称为Unicode字符集或通用字符集),所有UTF 编码格式编码方案都可以编码所有字符那套。

正如许多其他术语所发生的那样,程序员似乎倾向于在这里和那里滥用术语,而这只是其中的一个例子。

答案 3 :(得分:2)

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

答案 4 :(得分:0)

从所有可能的来源来看,UTF-8 被命名为一个编码,而不是一个字符集,句点。

然而它是由 Unicode 标准定义的,主要用于对 Unicode 字符集进行编码。只需检查 UTF 首字母缩略词的含义:Unicode 转换格式。它甚至提供了与一些以前的字符集(如 ASCII)的向后兼容性。因此,从实用的角度来看,使用 UTF-8 对 Unicode 以外的字符集进行编码是非常不寻常的。

这可能是在某些情况下错误地将 UTF-8 用作字符集的根源。