【问题标题】:Is utf-8 a character set or an encoding?utf-8 是字符集还是编码?
【发布时间】:2015-01-17 05:12:54
【问题描述】:

据我了解,Unicode 是一个字符集,包含所有语言中所有可能的字符。 Utf-8 是一种在内存中表示每个字符的方法。 如果是这样,我们为什么要放:

<meta charset="utf-8">

而不是

<meta encoding="utf-8">

在 html 文档中表示 utf-8 编码?

【问题讨论】:

  • 这肯定是语义问题吧? UTF-8 是一个字符集,您可以指定使用哪个字符集对文本进行编码。 Charset 只是它的标准属性名称。
  • 提问前请先做研究。
  • uft-8 不是编码,unicode 不是字符集吗?我的意思是,utf-8、utf-16 和 utf-32 都是编码 unicode 的不同方式,但它们仍然用于相同的字符集!
  • 这个问题似乎跑题了,因为它是一个理论上的推测,而不是一个实际的编程问题。

标签: html unicode utf-8


【解决方案1】:

&lt;meta charset="foo"&gt; 是原始 HTML 2.0 &lt;meta http-equiv="Content-Type" content="text/html; charset=foo"&gt; 构造的一个主要兼容的缩写。 meta http-equiv 用于(以有限的方式)将 HTTP 标头偷运到 HTML 文档中,因此此构造等效于在封闭的 HTTP 响应的 Content-Type 标头上设置 charset=foo

Content-Type HTTP 标头取自最初用于电子邮件的 MIME 标准(RFC2045,最初是 RFC1341)。该标准将其称为charset,因为它早于 Unicode。在那些日子里,ISO-8559-1、cp1251 等被认为是单独的字符集。只有当 Unicode 出现时,它才将它们重新定义为 One True 字符集的编码子集。

现在网络已经标准化了 Unicode(实际上是 UTF-16 代码单元,更可惜的是)作为其字符模型,将其描述为encoding 确实更准确。但是charset 这个名字已经卡住了,因为没有迫切需要修复它。

【讨论】:

  • 大部分互联网都采用 UTF-8 标准化,而不是 UTF-16。
  • @Remy:作为一个编码,是的。作为字符模型,JavaScript 和 DOM 接口都以 UTF-16 代码单元序列的形式提供对文本数据的访问,而不是 UTF-8 字节或完整的 Unicode 代码点。
  • 许多编程语言,尤其是脚本语言,已经标准化使用 UTF-16 在内存中表示文本数据,是的。
  • 那么你的明确答案是什么,是否是字符集?如果您能就此写出清晰的声明,将不胜感激。从你的回答和我到目前为止所读到的内容来看,这是一个 Unicode 字符集的编码方案。
  • 问题正确地指出 UTF-8 是一种编码。这个答案解释了为什么 HTML 文档仍然称它为“字符集”。
【解决方案2】:

UTF-8 是 Unicode 的一种编码;将其视为“字符集”并没有什么用处。

Unicode 是一项长期努力,旨在枚举大量世界书写系统中的“字形”(“字形”就是你我所说的字符)。在 Unicode 中,这些字符中的每一个都被赋予了一个数字——一个“代码点”——来标识它。因此,字形“a”(拉丁小写字母“a”)的代码点编号为 97(前 126 个字符的代码点与它们在 ASCII 中的数字相同并非巧合)。

因此,“Unicode 字符串”是一个 Unicode 代码点序列。这些是抽象整数。

如果您想将该代码点序列实际序列化为文件,或通过网络,则必须将其编码为字节序列。 这就是什么是“编码”。

UTF-8 是进行这种编码的少数标准方法之一; UTF-16 和 UTF-32 是另外两个标准,UCS-2 是现已弃用的标准。 UTF-8 是一种采用整数序列(这些代码点)并将其转换为字节序列的方法。我认为Wikipedia page on UTF-8 很清楚。

Joel Spolsky 有一个出色的摘要,名为 The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!),它是......嗯......它所说的。

(术语:“字符集”或“代码页”类似于 ASCII 或 ISO-8859-n(例如,Latin-1 块,@987654323 @) 这是一个将数字与字符相关联的固定大小的表。这个想法显然与 Unicode 的“所有字符列表”的想法有些重叠,而 Unicode 有时被描述为“通用字符集”这一事实有助于模糊这种区别。然而,Unicode 在作为“unicode 字符串”的抽象整数列表与其编码为出现在磁盘上的字节序列之间的明确区别是一个非常有价值的区别。当你有“啊哈” !' 的那一刻,明白了为什么这是一个非常有用的想法,Unicode 突然变得非常简单明了。)

【讨论】:

  • 刚写完这篇,我看到有一个similar question elsewhere。我什至发现我为那个问题添加了一个非常相似的答案......
【解决方案3】:

这两者之间曾经没有区别。例如,ASCII 定义某些字节来表示某些字母。它既可以称为编码,也可以称为字符集。或就此而言的“代码页”。这些都是密切相关的术语,本质上是同一个意思。 "encoding" 定义了某些字符如何以字节为单位进行编码。 "charset" 是一组可由计算机[使用特定方法] 表示的字符。 “codepage”是映射到字符的代码“页面”。这三个术语本质上是同一个意思。

只有 Unicode 在其“字符集”和它们所代表的物理编码之间引入了间接关系。对于大多数其他编码/字符集/代码页而言,情况并非如此。

他们在创建 HTML 时必须选择 一些 术语。他们选择了charset。与他们选择encoding相比,它没有更多或更少的意义。

【讨论】:

    【解决方案4】:

    “字符编码用于通过某种编码系统来表示一系列字符。” - 维基百科。

    UTF-8 是一个字符集。它定义了哪些二进制值代表编码系统中的字符。例如。在 UTF-8 a = 01100001 中。如果没有字符集,Web 浏览器/服务器可能会选择对字母 a 使用不同的值。这可能会导致各种问题。

    在 HTML5 5 文档中,您应该将其放在

    标记内:
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    

    在 HTML 4.01 文档中,您应该将其放在

    标记内::
    <meta charset="utf-8">
    

    【讨论】:

    • UTF-8 不是字符集,请参阅@bobince 答案。
    猜你喜欢
    • 2013-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-07
    • 1970-01-01
    • 1970-01-01
    • 2012-03-24
    • 2013-02-17
    相关资源
    最近更新 更多