日期:2014-05-17  浏览次数:21092 次

Encoder和Encoding有什么区别啊?
Encoder 类:MSDN,将一组字符转换为一个字节序列。
Encoding 类:MSDN,表示字符编码。

我知道Decoder是解码器
Encoder和Encoding有什么区别啊?实在搞不懂
Encoder和Encoding都有GetBytes方法,都是将一组字符编码到指定字节数组中

请指教啊

------解决方案--------------------
帮助中说的,应该可以理解吧

在派生类中重写时,获取一个解码器,该解码器将 Unicode 字符序列转换为已编码的字节序列。


Encoder..::.GetBytes 方法将连续的字符块转换为连续的字节块,采用的方式类似于该类的 GetBytes 方法。但是,Encoder 在调用之间维护状态信息,因此它可以正确地对跨块的字符序列进行编码。Encoder 还保留数据块结尾的尾部字符并将这些尾部字符用在下一次编码操作中。例如,一个数据块的末尾可能是一个不匹配的高代理项,而与其匹配的低代理项则可能位于下一个数据块中。因此,GetDecoder 和 GetEncoder 在网络传输和文件操作中很有用,这是因为这些操作通常处理数据块而不是完整的数据流。

给实现者的说明:

默认实现返回一个 Encoder,它调用当前 Encoding 的 GetByteCount 和 GetBytes 方法。您的应用程序必须重写此方法以返回在调用之间维护其状态的 Encoder。

------解决方案--------------------
你给的MSDN足够说明了两者的关系了,请看这里:
若要获取 Encoder 类某个实现的实例,应用程序应当使用 Encoding 实现的 GetEncoder 方法。

可见,一般不直接使用Encoder 类,而是通过Encoding 来获取具体编码规则的Encoder类,或者直接通过Encoding 类操作,否则你不能控制字符编码。
------解决方案--------------------
第一两个是不同的class
不同class中方法是可以重命名的
new Encoding().GetBytes();
new Encoder.GetBytes()

虽然方法相同名可参数确不一样 如果一样要这两个一样的方法做什么微软不会写这种没用代码。

Encoding还有.UTF8这样的静态 方法来获取指定编码格式字符串转换的BTYE[]
------解决方案--------------------
请看这里,这是一个派生类的说明,比基类的详细:
http://msdn.microsoft.com/zh-cn/library/system.text.utf8encoding.getencoder.aspx

备注部分说明了它的使用场合,它主要用在不连续的编码或解码中,当数据量过大,或者网络传输中尚未收到全部数据就开始处理是,用这个方法得到Encoder 类或Decoder类,比直接使用Encoding 要好,因为前者维护了数据块结尾的信息,用在下次编码操作中。
------解决方案--------------------
说得更通俗点,当一个汉字用2个字节表示的时候,你收到9个字节,那么只可能包含4个汉字,最后一个字节只有半个汉字,那么这半个汉字如何处理?这里就需要合并到下次处理过程中。
对于UTF8编码这种不定长的编码规则是最有意义的,因为不定长编码,结尾处很可能被拆分。
------解决方案--------------------
难道我6楼的解释还不通俗吗?不要看什么连续块,只要看你是否要拆分。
就好比你发送一个文件,每次只发送1024字节而不是一次性发送整个文件大小,那么发送和接收就需要对这个大字符串(也叫连续块)拆分了处理,不拆没事,一拆就出问题了,编码是需要整体考虑才是正常编码,如果一个2字节编码的汉字被拆开两个字节单独处理,那还是汉字吗?
------解决方案--------------------
http://www.cnblogs.com/criedshy/archive/2012/08/08/2628554.html