通常,要从字节流中读取字符,您可以使用 StreamReader。在此示例中,我从无限流中读取由“\r”分隔的记录。
using(var reader = new StreamReader(stream, Encoding.UTF8))
{
var messageBuilder = new StringBuilder();
var nextChar = 'x';
while (reader.Peek() >= 0)
{
nextChar = (char)reader.Read()
messageBuilder.Append(nextChar);
if (nextChar == '\r')
{
ProcessBuffer(messageBuilder.ToString());
messageBuilder.Clear();
}
}
}
问题是 StreamReader 有一个小的内部缓冲区,因此如果代码等待“记录结束”分隔符(在本例中为“\r”),它必须等到 StreamReader 的内部缓冲区被刷新(通常是因为更多字节)已经到了)。
此替代实现适用于单字节 UTF-8 字符,但不适用于多字节字符。
int byteAsInt = 0;
var messageBuilder = new StringBuilder();
while ((byteAsInt = stream.ReadByte()) != -1)
{
var nextChar = Encoding.UTF8.GetChars(new[]{(byte) byteAsInt});
Console.Write(nextChar[0]);
messageBuilder.Append(nextChar);
if (nextChar[0] == '\r')
{
ProcessBuffer(messageBuilder.ToString());
messageBuilder.Clear();
}
}
如何修改此代码以使其适用于多字节字符?
而不是Encoding.UTF8.GetChars
它旨在转换完整的缓冲区,获取一个实例Decoder
并重复调用其成员方法GetChars http://msdn.microsoft.com/en-us/library/system.text.decoder.getchars.aspx这将利用Decoder
的内部缓冲区,用于处理从一次调用结束到下一次调用的部分多字节序列。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)