我有一个尝试从二进制流中解码不同字符串编码的进程。当我逐步完成它时,我得到了一些在我脑海里并没有完全添加的行为。具体来说,我所做的是:
Encoding.GetCharCount
来确定这些字节中可能编码的字符数(可能是0或1 ......)Encoding.GetString
从字节数组中抓取字符BTW,如果有人注意到上述任何不正确的假设,请随时说出来......
我将解码器设置为在无法解码给定字节集时抛出DedcoderFallbackExceptions
。让我感到困惑的是,有时候当我拨打GetCharCount
时会出现异常,有时候当我呼叫GetString
时会出现异常。这有什么理由应该发生吗?这实际上是预期的吗?我希望能够在尽可能少的地方可靠地检查是否存在可打印字符 - 目前我在几个地方都在这样做。
有什么想法吗?
感谢, 布赖恩
BIG UPDATE: 似乎我对问题的初步描述缺乏一点。让我为问题添加一些前提:
希望这澄清了一些问题。到目前为止的回应非常有帮助!请继续!
答案 0 :(得分:3)
像UTF8这样的编码对字符使用可变数量的字节,因此您不能简单地将最大字节数乘以从流中获取。最后一个字节可能位于字符的中间(并且可能在隔离时无效),或者最后一个字符可能表示该特定编码上的完全不同的字符。
答案 1 :(得分:1)
哇。听起来像强大的矫枉过正。您是否尝试过使用编码的GetDecoder方法?它通过GetChars方法向您提供一个Decoder,您可以将字节数组和char数组提供给它,并使用从字节数组中解码的可用字符填充char数组。
如果有任何过冲(即备用字节),这些将保存在解码器状态,以便您下次使用新字节调用GetChars。
您可以使用StringBuilder来组合结果。
比你的方法简单一点。
答案 2 :(得分:1)
如果我正确理解了您的问题,您是否尝试使用未知编码从字节流中读取字符数据?
如果我的假设是正确的,那么你需要首先检测编码,并使用TextReader读取读取字节流,然后你不需要担心不同的字符大小,TextReader将为你完成所有工作
我知道两种从字节流中检测编码的方法: