C#Text.Encoder和Text.Encoding有什么区别

时间:2017-06-12 21:17:02

标签: c# unicode encoding encoder

我目前正在以字节为单位使用Unicode,并使用Encoding类来获取字节并获取字符串。

但是,我看到有一个编码器类,它似乎与编码类做同样的事情。有谁知道它们之间的区别以及何时使用其中任何一个。

以下是Microsoft文档页面:

编码器:https://msdn.microsoft.com/en-us/library/system.text.encoder(v=vs.110).aspx

编码:https://msdn.microsoft.com/en-us/library/system.text.encoding(v=vs.110).aspx

1 个答案:

答案 0 :(得分:7)

肯定存在差异。 Encoding是一种将字符序列转换为字节的算法,反之亦然。 Encoder是一个有状态的对象,它将字符序列转换为字节。要获取Encoder对象,通常在Encoding对象上调用GetEncoder。为什么有必要进行有状态转换?想象一下,您正在尝试有效地编码长字符序列。您希望避免创建大量数组或一个巨大的数组。所以你将字符分解成可重复使用的1K字符缓冲区。然而,这可能会产生一些非法字符序列,例如utf-16代理对被分解为单独调用GetBytesEncoder对象知道如何处理此问题,并在对GetBytes的连续调用中保存必要的状态。因此,您使用Encoder来转换自包含的一个文本块。我相信只要在最后一个字符数组中调用了flush等于true的GetBytes,就可以重复使用Encoder实例对文本的多个部分进行更多转换。如果您只想轻松编码短字符串,请使用Encoding.GetBytes方法。对于解码操作,存在类似的解码器类,其保持解码状态。