我可以保证Response.Filter的Stream.Write()方法不会有部分字符字节吗?

时间:2009-10-07 10:23:04

标签: c# asp.net iis

我正在创建一个System.IO.Stream实现,目的是为HttpContext.Response.Filter设置过滤器。我想知道所有Write(byte[], int, int)的调用是否会保证写入的字节包含整个字符字节序列,或者是否可能在调用中分割单个字符(在utf-32编码的情况下)。

public override void Write(byte[] buffer, int offset, int count) {
    // Here `e' is a reference to `ctx.Response.ContentEncoding'
    // from the original context.
    char[] chars = e.GetChars(buffer, offset, count);
    //... Stream processing logic here.
}

我目前使用utf-32测试证明,调用似乎总是只包含整个字符字节序列,但在验证我的假设之前我想要确认。

如果写入的字节很可能在调用Write之间拆分,那么解决这个问题的最佳方法是什么?我想在我的构造函数中执行单字节宽度检查,并使用它来查看字节数组是否可以被该值整除。然而,这实际上是不希望的,尽管实施起来相当简单。

// Here `e' is a reference to `ctx.Response.ContentEncoding'
// from the original context.
// `charLen' will yield 4 for a utf-32 encoding.
charLen = e.GetByteCount(new char[] { ' ' });

1 个答案:

答案 0 :(得分:4)

Streams不知道他们是在处理字符数据还是二进制数据。这取决于过滤器或可能包含您的流的StreamWriter,以决定它是否会一次写出整个字符。

我个人期望 StreamWriter只写出完整的字符,但我不认为我会依赖它。我看不到保证这种行为的任何事情。

我建议你使用System.Text.Decoder(通过调用Encoding.GetDecoder获得)并使用它来维持适当的状态。实际上,这正是它的设计目的:)有关详细信息,请参阅链接的文档。