【发布时间】:2018-10-02 17:47:00
【问题描述】:
通常,要从字节流中读取字符,您使用 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();
}
}
如何修改此代码以使其适用于多字节字符?
【问题讨论】:
-
不应该将标题修改为多字节或UTF-16字符而不是UTF-8吗?似乎具有误导性。
-
@TimS。 UTF-8 字符可以多于一个字节。
-
@TimS。你是什么意思?多字节 UTF-8 字符不会自动变为 UTF-16 字符。 Wiki.
-
UTF-8 字符可以是多字节en.wikipedia.org/wiki/Utf-8
-
@MikeHadlow 啊,感谢您的更正和信息。我没有意识到 UTF-8 可以包含多字节字符。