ChatGPT解决这个技术问题 Extra ChatGPT

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

这个问题在这里已经有了答案:UTF-8 和 Unicode 有什么区别? (18 个回答) 5 年前关闭。

考虑:

https://i.stack.imgur.com/3ayWh.jpg

unicode=utf16 是真的吗?

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

不,我不能,因为大多数文本编辑器都是这样做的。
@olly:您使用的是 Windows 吗?获取Notepad++
我正在使用editplus,它总是很好,我不想切换。

D
DSlatkin

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

如果被问到“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 该应用程序知道该数据表示一个用 UTF-8 编码的 Unicode 字符串,并且必须将其作为文本显示给用户。第一步,是将二进制数据转换为数字。该应用程序使用 UTF-8 算法对数据进行解码。在这种情况下,解码器返回: 104 101 108 108 111 由于应用程序知道这是一个 Unicode 字符串,它可以假设每个数字代表一个字符。我们使用 Unicode 字符集将每个数字转换为相应的字符。结果字符串是“你好”。结论 因此,当有人问您“UTF-8 和 Unicode 有什么区别?”时,您现在可以自信地简短而准确地回答:UTF-8(Unicode 转换格式)和 Unicode 无法比较。 UTF-8 是一种用于将数字转换为二进制数据的编码。 Unicode 是用于将字符转换为数字的字符集。


这是完全正确的,并且回答了标题中提出的问题。它确实回答了实际问题,该问题基于 Microsoft 使用 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 文章
h
hannson

大多数编辑器实际上支持另存为“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 标准。


P
Preet Sangha

没那么简单。

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!) 链接。


J
Jerry Coffin

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

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

有一次,Unicode 定义了自己的字符集,或多或少是 ISO 10646 的竞争对手。那是一个 16 位字符集,但不是 UTF-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 的发明吗?
M
Mark Ransom

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

不要让来自 Microsoft 的不幸历史文物让您感到困惑。


T
Trufa

Unicode 的开发旨在创建一个新标准,用于映射当今使用的绝大多数语言中的字符,以及其他不是那么重要但可能是创建文本所必需的字符。 UTF-8 只是您可以对文件进行编码的众多方式之一,因为您可以通过多种方式将文件中的字符编码为 Unicode。

资源:

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


P
Peter Mortensen

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


所以对于 Visual Studio,Unicode=UTF16 成立,对吗?
@ollydbg,UTF-16 确实是 Windows 中 Unicode 的自然表示,但这并不能使它们完全相同。
P
Peter Mortensen

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


P
Peter Mortensen

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

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


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