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