.NET Stream Decoders行为

时间:2009-07-01 22:55:40

标签: .net unicode stream binary-data decoding

我有一个尝试从二进制流中解码不同字符串编码的进程。当我逐步完成它时,我得到了一些在我脑海里并没有完全添加的行为。具体来说,我所做的是:

  • 获取用于对给定编码中的字符进行编码的最大字节数
  • 从流中获取字节数
  • 使用Encoding.GetCharCount来确定这些字节中可能编码的字符数(可能是0或1 ......)
  • 如果它不为零我使用Encoding.GetString从字节数组中抓取字符
  • 然后我弄清楚用了多少字节对提取的字符进行编码并按照该数量推进流索引
  • 如果可解码字节的数量变为零,我将索引推进一个字节并再次尝试整个...以这种方式我希望不会错过任何可解码的字符

BTW,如果有人注意到上述任何不正确的假设,请随时说出来......

我将解码器设置为在无法解码给定字节集时抛出DedcoderFallbackExceptions。让我感到困惑的是,有时候当我拨打GetCharCount时会出现异常,有时候当我呼叫GetString时会出现异常。这有什么理由应该发生吗?这实际上是预期的吗?我希望能够在尽可能少的地方可靠地检查是否存在可打印字符 - 目前我在几个地方都在这样做。

有什么想法吗?

感谢, 布赖恩

BIG UPDATE: 似乎我对问题的初步描述缺乏一点。让我为问题添加一些前提:

  • 流可能 非常 大 - 不适合大多数用户的内存
  • 在流中的任何给定位置我不确定我是在文本的开头,在文本的中间
  • 在流中的任何给定位置我不知道我是在多字节字符的中间还是开头
  • 该流将包含许多实际上不是任何文本的材料,以及一些不同的编码

希望这澄清了一些问题。到目前为止的回应非常有帮助!请继续!

3 个答案:

答案 0 :(得分:3)

像UTF8这样的编码对字符使用可变数量的字节,因此您不能简单地将最大字节数乘以从流中获取。最后一个字节可能位于字符的中间(并且可能在隔离时无效),或者最后一个字符可能表示该特定编码上的完全不同的字符。

答案 1 :(得分:1)

哇。听起来像强大的矫枉过正。您是否尝试过使用编码的GetDecoder方法?它通过GetChars方法向您提供一个Decoder,您可以将字节数组和char数组提供给它,并使用从字节数组中解码的可用字符填充char数组。

如果有任何过冲(即备用字节),这些将保存在解码器状态,以便您下次使用新字节调用GetChars。

您可以使用StringBuilder来组合结果。

比你的方法简单一点。

答案 2 :(得分:1)

如果我正确理解了您的问题,您是否尝试使用未知编码从字节流中读取字符数据?

如果我的假设是正确的,那么你需要首先检测编码,并使用TextReader读取读取字节流,然后你不需要担心不同的字符大小,TextReader将为你完成所有工作

我知道两种从字节流中检测编码的方法:

  1. Ude is a C# port of Mozilla Universal Charset Detector
  2. IE MultiLang services