1

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

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

顺便说一句,如果有人注意到上述任何不正确的假设,请随意说...

当我的解码器DedcoderFallbackExceptions无法解码给定的一组字节时,我将它们设置为抛出。让我感到困惑的是,有时在我调用时会出现异常,GetCharCount而有时会在我调用时出现异常GetString。有什么理由应该发生这种情况吗?这实际上是预期的吗?我希望能够在尽可能少的地方可靠地检查可打印字符的存在 - 目前我正在几个地方做这件事。

有什么想法吗?

谢谢,布赖恩

大更新: 我对问题的最初描述似乎有点不足。让我为这个问题添加更多前提:

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

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

4

3 回答 3

3

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

于 2009-07-01T23:06:25.247 回答
1

Wow. Sounds like mighty overkill. Have you tried using the GetDecoder method of your encoding? It hands you a Decoder with a GetChars method that you feed a byte array and a char array to and it fills the char array with the available characters decoded from the byte array.

If there's any overshoot (i.e. spare bytes) these are saved in the state of the decoder for the next time that you call GetChars with fresh bytes.

You can use a StringBuilder to assemble the result.

A little simpler than your method.

于 2009-07-01T23:19:51.850 回答
1

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

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

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

  1. Ude 是 Mozilla Universal Charset Detector 的 C# 端口
  2. IE 多语言服务
于 2009-07-02T09:34:27.980 回答