【发布时间】:2009-07-01 22:55:40
【问题描述】:
我有一个尝试从二进制流中解码不同编码的字符串的过程。当我逐步完成它时,我得到了一些在我脑海中并没有完全加起来的行为。具体来说,我要做的是:
- 获取用于在给定编码中对字符进行编码的最大字节数
- 从流中获取字节数
- 使用
Encoding.GetCharCount来确定在这些字节中可能编码了多少个字符(可能是 0 一个或两个...) - 如果它不为零,我使用
Encoding.GetString从字节数组中抓取字符 - 然后我计算出用于对提取的字符进行编码的字节数并将流索引推进该数量
- 如果可解码字节数为零,我将索引前移一个字节并再次尝试整个过程...以这种方式,我希望不会错过任何可解码字符
顺便说一句,如果有人注意到上述任何不正确的假设,请随意说...
当我的解码器无法解码给定的一组字节时,我将它们设置为抛出DedcoderFallbackExceptions。让我感到困惑的是,有时当我调用GetCharCount 时会出现异常,而有时当我调用GetString 时会出现异常。有什么理由应该发生这种情况吗?这实际上是预期的吗?我希望能够在尽可能少的地方可靠地检查可打印字符的存在 - 目前我正在几个地方进行检查。
有什么想法吗?
谢谢, 布莱恩
重大更新: 看来我对这个问题的初步描述有点欠缺。让我为这个问题添加几个前提:
- 流可能非常很大 - 它不会适合大多数用户的内存
- 在流中的任何给定位置,我都不确定我是否在文本的开头,在文本的中间
- 在流中的任何给定位置,我不知道我是在多字节字符的中间还是开头
- 流将包含许多实际上不是任何类型的文本的材料,以及少量不同的编码
希望这可以澄清一些问题。到目前为止的回复非常有帮助!请继续!
【问题讨论】:
-
我真的不明白你为什么要这样做。如果可能,最有效的方法是将整个内容读入内存并一次性处理。
标签: .net unicode stream binary-data decoding