我正在创建一个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[] { ' ' });
答案 0 :(得分:4)
Streams不知道他们是在处理字符数据还是二进制数据。这取决于过滤器或可能包含您的流的StreamWriter
,以决定它是否会一次写出整个字符。
我个人期望 StreamWriter
只写出完整的字符,但我不认为我会依赖它。我看不到保证这种行为的任何事情。
我建议你使用System.Text.Decoder
(通过调用Encoding.GetDecoder
获得)并使用它来维持适当的状态。实际上,这正是它的设计目的:)有关详细信息,请参阅链接的文档。