C# Text.Encoder 和 Text.Encoding 有啥区别

Posted

技术标签:

【中文标题】C# Text.Encoder 和 Text.Encoding 有啥区别【英文标题】:C# What is the difference between Text.Encoder and Text.EncodingC# Text.Encoder 和 Text.Encoding 有什么区别 【发布时间】:2017-11-14 11:39:23 【问题描述】:

我目前在字节中使用 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

【问题讨论】:

没什么。看起来像不同版本的网络库的文档,但信息基本相同。 这些类自 .Net 早期(可能从第一个版本以来)作为框架的一部分共存。 这是一个非常好的问题,我很惊讶以前没有人问过这个问题。或者我的 Google-fu 不够强大。 msdn.microsoft.com/en-us/library/…有一些有用的信息 还有System.Text.Decoder,补图很重要。它们各自完成编码工作的一半。 【参考方案1】:

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

【讨论】:

换句话说,一个 EncodER 创建和 EncodING @ErikFunkenbusch 反过来,编码创建编码器。 抱歉回复晚了。非常感谢,因为以前没有人问过这个问题。如果我错了,请纠正我,“编码”一次编码/解码字符。 “编码器”通过将字符分成块来对字符进行编码/解码,因此它可以处理更长的字符列表作为继续操作。

以上是关于C# Text.Encoder 和 Text.Encoding 有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

golang解析excelcsv编码格式

C#多线程之旅——介绍和基本概念

C#多线程之旅

比较 c#、c++ 和 java 的性能(c# 的奇怪行为)

C#和Java交互相关研究

C# 二十年语法变迁之 C# 5 和 C# 6参考