UTF8/UTF16和Base64在编码方面有什么区别?

99

在C#中,我们可以使用以下类进行编码:

  • System.Text.Encoding.UTF8
  • System.Text.Encoding.UTF16
  • System.Text.Encoding.ASCII

为什么没有System.Text.Encoding.Base64呢?

我们只能使用Convert.From(To)Base64String方法,base64有什么特殊之处吗?

我是否可以说base64和UTF-8是相同的编码方法?或者UTF-8是base64的一种?

4个回答

157

UTF-8UTF-16 是将 Unicode 字符串编码为字节序列的方法。

参见:Joel on Software 的文章“关于 Unicode 和字符集,每个软件开发人员必须知道的绝对最少知识(无可推辞!)”

Base64 是将字节序列编码为字符串的方法。

因此,这些是非常不同的概念,不应混淆。

需要记住的事情:

  • 并非每个字节序列都表示用 UTF-8 或 UTF-16 编码的 Unicode 字符串。

  • 并非每个 Unicode 字符串都表示用 Base64 编码的字节序列。


36

Base64是一种编码二进制数据的方式,而UTF8和UTF16是编码Unicode文本的方法。请注意,在像Python 2.x这样的语言中,二进制数据和字符串被混合使用,您可以以相同的方式将字符串编码为base64或utf8:

u'abc'.encode('utf16')
u'abc'.encode('base64')

但在那些数据类型分离更加明确的语言中,两种表示数据的方式通常具有非常不同的效用,以保持关注点分离。


15
“Base64是一种对二进制数据进行编码的方式,而UTF8和UTF16是对Unicode文本进行编码的方式。”这句话已经说明了一切。 - Aniket Thakur

31

UTF-8是一种字符编码,类似于其他UTF编码,用于编码Unicode字符集USC中的字符。

Base64是一种编码,可以将任何字节序列表示为可打印字符序列(即A-Za-z0-9+/)。

没有System.Text.Encoding.Base64,因为Base64不是文本编码,而是像十六进制一样的基数转换,使用0-9A-F(或a-f)来表示数字。


3
简单地说,字符编码(如UTF8或UTF16)用于将数字(即字节)与字符相匹配,例如在ASCII中65匹配为“A”,而基础编码主要用于将字节转换为可打印的字节,这些字节是ASCII字符编码的子集,因此您可以将Base64视为一种将字节转换为文本的编码机制。使用Base64的主要原因是通过不允许二进制数据传输的通道传输数据。也就是说,现在应该清楚了,您可以拥有一个以Base64编码的流,该流表示一个UTF8编码的流。"最初的回答"

1
"字节到字节": 实际上并非如此(但在像C这样的语言中可能看起来是这样)。目的是获取可以在下游处理为此类的文本,例如基于文本的封装(例如XML、HTML、SMTP)。然后,该文本必须使用相互理解的字符编码进行字符编码(或者可能已经由特定库的Base64实现进行了编码)。可以说字符编码应该是众多字符编码之一,对于它们的字节(如果必须,称其为ASCII)将是相同的;或者,它可以是UTF-16之类的编码,其中它们会非常不同。 - Tom Blodget

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