编码.UTF8还是编码.Unicode?

3

Encoding.Unicode是不是只是UTF-16的别名?那么为什么它被称为Unicode而不是UTF16?

编码文档中,Microsoft指出,在大多数情况和应用程序中,您应避免使用Encoding.ASCIIEncoding.Default

当使用System.Text.Encoding时,在大多数情况下,我应该使用Encoding.Unicode还是Encoding.UTF8

2个回答

4

Encoding.Unicode 是否只是UTF-16的名称?

是的,具体来说是小端UTF-16。对于大端UTF-16,Encoding有一个单独的BigEndianUnicode属性。

那么为什么它被称为Unicode而不是UTF16呢?

出于历史原因。Microsoft是第一批采用Unicode的公司之一,因此在Unicode的早期版本中,Windows中就有了“Unicode”实现。 “Unicode”是Microsoft用来指代其本机Unicode编码的事实标准名称,以前是UCS-2,现在是UTF-16。

在使用System.Text.Encoding时,我应该使用Encoding.Unicode还是Encoding.UTF8?

这取决于你的特定场景。使用适合您需求的任何编码。这两个编码都有优缺点。

UTF-8通常用于通信协议的互操作性,因为它不会遇到字节序问题,并且与大多数现有的基于文本的协议兼容。对于大多数语言,它的字节存储比UTF-16小。

UTF-16通常比UTF-8更易于在内存中处理,这就是为什么许多库和框架将其用于字符串的原因。对于东亚语言,它的字节存储可能比UTF-8更小。


哪种编码在大多数情况下、大多数时间和大多数应用程序中都应该使用?哪个应该成为我的首选变体?UTF-8 还是 UTF-16? - undefined
@Fred 在许多语言中,自从VB4以来,UTF-16/UCS-2被用于文本数据类型(String、Char、Character)。因此,在这些语言中使用它们是很自然的选择。同时,Windows API和NTFS也使用它,所以在这方面也是一样的。在SQL Server中,NCHAR/NVARCHAR是处理Unicode文本的唯一方式。在UTF-8方面,当在系统之间传输时,JSON要求使用UTF-8编码。最终,所选择的字符编码是必须在写入者和读取者之间共享的元数据。 - undefined
@Fred 再次提醒你,这取决于你对 Encoding 的具体需求。你正在问一个有主观倾向的问题。我的意见是UTF-8通常足够了,但UTF-16也有其用途。 - undefined

3

这个来源于Unicode早期的版本。Unicode 1.0作为一个16位编码,因为65536个代码点被认为是足够的。然而,Unicode 2.0放弃了这个限制,但早期的Unicode采用者,包括Microsoft,在命名他们的编码时使用了Unicode,这种做法一直沿用至今。

现在除非你有特定的原因(例如需要与遗留软件集成),否则应该使用UTF-8。

原因是ASCII与UTF-8二进制兼容,并且ASCII广泛存在。


我明白我应该优先选择UTF-8而不是ASCII。但是Encoding.Unicode和UTF-16是一样的吗?我应该使用Encoding.UTF8还是Encoding.Unicode - undefined
1
Encoding.Unicode与UTF16相同,而默认情况下应该使用Encoding.UTF8。我认为这一点在我的回答中已经很清楚了。 - undefined
1
在编码方面,这是作者选择的。在个人电脑世界中(自1981年以来),选择ASCII编码一直相当困难或不可能。它在MS-DOS中不可用;它也不是任何操作系统(据我所知)和几乎没有任何程序的默认编码。原因是当时有一个大力推动将更大的字符集作为默认设置。不幸的是,当时可用的是数十种字符集,每个字符集约有<= 256个代码点。最重要的是:使用与写入时使用的字符编码相同的编码进行阅读。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接