Unicode 和 UTF-8 有啥区别? [复制]

Posted

技术标签:

【中文标题】Unicode 和 UTF-8 有啥区别? [复制]【英文标题】:What's the difference between Unicode and UTF-8? [duplicate]Unicode 和 UTF-8 有什么区别? [复制] 【发布时间】:2011-04-26 11:43:10 【问题描述】:

考虑:

unicode=utf16是真的吗?

许多人说 Unicode 是一种标准,而不是一种编码,但实际上大多数编辑器都支持另存为 Unicode encoding

【问题讨论】:

不,我不能,因为大多数文本编辑器都是这样做的。 @olly:您使用的是 Windows 吗?获取Notepad++。 我在用editplus,一直很好,不想换了。 另见***.com/questions/700187/… 【参考方案1】:

正如拉斯穆斯在他的文章 "The difference between UTF-8 and Unicode?" 中所说:

如果问这个问题,“UTF-8 和 UTF-8 有什么区别? Unicode?”,你会自信地用简短而准确的回答 回答?在国际化的这些日子里,所有开发人员都应该 能够做到这一点。我怀疑我们中的许多人不理解这些概念 以及我们应该的。如果你觉得你属于这个群体,你应该 阅读这篇关于字符集和编码的超简短介绍。

实际上,比较 ​​UTF-8 和 Unicode 就像比较苹果和 橘子:

UTF-8 是一种编码 - Unicode 是一个字符 设置

字符集是具有唯一编号的字符列表(这些 数字有时被称为“代码点”)。例如,在 Unicode 字符集,A 的数字是 41。

另一方面,编码是一种算法,可以翻译 将数字列表转换为二进制,以便可以将其存储在磁盘上。例如 UTF-8 会像这样翻译数字序列 1、2、3、4:

00000001 00000010 00000011 00000100 

我们的数据现在被翻译成二进制,现在可以保存到 磁盘。

现在都在一起

假设应用程序从磁盘读取以下内容:

1101000 1100101 1101100 1101100 1101111 

应用程序知道此数据表示一个 Unicode 字符串,编码为 UTF-8 并且必须将其作为文本显示给用户。第一步,是 将二进制数据转换为数字。该应用程序使用 UTF-8 算法 解码数据。在这种情况下,解码器返回:

104 101 108 108 111 

由于应用知道这是一个 Unicode 字符串,它可以假设每个 数字代表一个字符。我们使用 Unicode 字符集来 将每个数字转换为相应的字符。所结果的 字符串是“你好”。

结论

所以当有人问你“UTF-8 和 Unicode?”,您现在可以自信地简短而准确地回答:

UTF-8(Unicode 转换格式)和 Unicode 无法比较。 UTF-8 是一种编码 用于将数字转换为二进制数据。 Unicode 是一个字符集 用于将字符转换为数字。

【讨论】:

这是完全正确的,并且回答了标题中提出的问题。但它确实回答了实际问题,该问题基于微软使用Unicode 引用UTF-16 的虚假陈述。 我很抱歉,但我根本没有关注,“它使用 utf8 算法来解码二进制文件”什么?二进制是二进制,它只需要将数学转换回十进制。如果你告诉我 decimal(41) 是 unicode 中的 A,那么我不需要任何其他东西来将其存储为二进制并取回。 UTF-8 编码根据每个字符动态分配位。而 unicode 为每个字符使用 32 位。此答案示例仅使用 7 位 ASCII 字符,这就是为什么易于理解并满足大多数读者的原因,但 UTF-8 并不那么容易。如果你也放一些多字节的例子就好了。 UTF-8 不仅是一种编码,它还是一个字符集。或者更准确地说,UTF-8 使用 Unicode 作为其字符集。我的意思是你不能用它作为另一个字符集的编码。 @sliders_alpha “二进制是二进制,它只需要数学转换回十进制” - 错误,非常错误。我们在这里讨论的不是数字基数,而是编码方案。 UTF-8 不只是将十进制数转换为二进制数,它比这更复杂。此答案中给出的示例很差,因为它使用数字 1、2、3 和 4,它们恰好编码为它们的二进制表示,但通常情况并非如此。特别是对于在编码中使用非平凡位偏移的 UTF-8。我建议你阅读关于 UTF-8 编码算法的 Wiki 文章【参考方案2】:

实际上大多数编辑器都支持另存为“Unicode”编码。

这是一个不幸的 Windows 错误命名。

因为 Windows 内部使用 UTF-16LE 编码作为 Unicode 字符串的内存存储格式,它认为这是 Unicode 文本的自然编码。在 Windows 世界中,有 ANSI 字符串(当前机器上的系统代码页,完全不可移植)和 Unicode 字符串(内部存储为 UTF-16LE)。

这一切都是在 Unicode 的早期设计的,那时我们还没有意识到 UCS-2 还不够,也没有发明 UTF-8。这就是为什么 Windows 对 UTF-8 的支持很差的原因。

这种误导性的命名方案成为用户界面的一部分。使用 Windows 编码支持来提供一系列编码的文本编辑器会自动且不恰当地将 UTF-16LE 描述为“Unicode”,将 UTF-16BE(如果提供)描述为“Unicode big-endian”。

(其他自己编码的编辑器,比如 Notepad++,没有这个问题。)

如果它让您感觉更好,“ANSI”字符串也不基于任何 ANSI 标准。

【讨论】:

【参考方案3】:

没那么简单。

UTF-16 是一种 16 位、可变宽度编码。简单地称其为“Unicode”是模棱两可的,因为“Unicode”指的是一整套字符编码标准。 Unicode 不是编码!

http://en.wikipedia.org/wiki/Unicode#Unicode_Transformation_Format_and_Universal_Character_Set

当然还有Joel On Software - The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!) 链接。

【讨论】:

【参考方案4】:

这里显示了很多误解。 Unicode 不是一种编码,但无论如何,Unicode 标准主要致力于编码。

ISO 10646 是您(可能)关心的国际字符集。它定义了一组命名字符(例如,“拉丁大写字母 A”或“希腊小写字母 alpha”)和一组代码点(分配给每个字符的数字——例如,61 十六进制和 3B1 十六进制)之间的映射。这两个分别;对于 Unicode 代码点,标准符号是 U+0061 和 U+03B1)。

曾经,Unicode 定义了自己的字符集,或多或少是作为 ISO 10646 的竞争对手。那是一个 16 位字符集,但它不是 UTF-16;它被称为UCS-2。它包括一种颇具争议的技术,试图将必要字符的数量保持在最低限度(汉族统一——基本上将非常相似的中文、日文和韩文字符视为同一个字符)。

从那时起,Unicode 联盟默认这行不通,现在主要关注如何编码 ISO 10646 字符集。主要方法是 UTF-8、UTF-16 和 UCS-4(又名 UTF-32)。那些(UTF-8 除外)也有 LE(小端)和 BE(大端)变体。

就其本身而言,“Unicode”可以指代几乎所有上述内容(尽管我们可能会消除它明确显示的其他内容,例如 UTF-8)。 “Unicode”的不合格使用可能最常发生在 Windows 上,它几乎肯定是指 UTF-16。当 UCS-2 流行时,Windows NT 的早期版本采用了 Unicode。在 UCS-2 被宣布过时(在 Win2k 左右,如果有记忆的话),他们切换到 UTF-16,它与 UCS-2 最相似(事实上,它对于“基本多语言平面”中的字符是相同的,它涵盖了很多,包括大多数西欧语言的所有字符)。

【讨论】:

好吧,为什么 MS 将其延续到 .NET? .NET 不是后 Win2k 的发明吗?【参考方案5】:

UTF-16 和 UTF-8 都是 Unicode 的编码。它们都是 Unicode;一个不比另一个更多 Unicode。

不要让来自 Microsoft 的不幸历史文物迷惑您。

【讨论】:

【参考方案6】:

Unicode 的发展目标是 在创建新的地图标准 绝大多数的角色 今天使用的语言, 与其他字符一起 不是那么重要,但可能是 创建文本所必需的。 UTF-8 只是您可以使用的众多方式中的一种 可以对文件进行编码,因为有 您可以通过多种方式对 将文件中的字符转换为 Unicode。

来源:

http://www.differencebetween.net/technology/difference-between-unicode-and-utf-8/

【讨论】:

【参考方案7】:

除了 Trufa 的评论之外,Unicode 明确地不是 UTF-16。当他们第一次研究 Unicode 时,推测 16 位整数可能足以存储任何代码,但实际上事实并非如此。然而,UTF-16 是 Unicode 的另一种有效编码——除了 8 位和 32 位变体之外——我相信这是微软在 NT 派生操作系统上运行时在内存中使用的编码。

【讨论】:

所以对于视觉工作室,Unicode=UTF16 成立,对吧? @ollydbg,UTF-16 确实是 Unicode 在 Windows 中的自然表示,但这并不意味着它们完全相同。【参考方案8】:

我们首先要记住数据是以字节形式存储的; Unicode 是一个字符集,其中字符映射到代码点(唯一整数),我们需要一些东西来将这些代码点数据转换为字节。这就是 UTF-8 出现所谓编码的地方——很简单!

【讨论】:

【参考方案9】:

这很奇怪。 Unicode 是一种标准,而不是一种编码。由于可以指定字节顺序,我猜它实际上是 UTF-16 或 32。

这个菜单是从哪里提供的?

【讨论】:

来自名为editplus的文本编辑器。

以上是关于Unicode 和 UTF-8 有啥区别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

utf8_general_ci 和 utf8_unicode_ci 有啥区别? [复制]

utf8_general_ci 和 utf8_unicode_ci 有啥区别? [复制]

utf8_general_ci 和 utf8_unicode_ci 有啥区别? [复制]

utf8_general_ci 和 utf8_unicode_ci 有啥区别? [复制]

Windows 记事本的 ANSI,Unicode,UTF-8 这三种编码模式有啥区别

使用 UTF-8 优于 UTF-16 有啥优势? [复制]