Как вы читаете UTF -8 символов из бесконечного потока байтов -C#

Обычно для чтения символов из потока байтов используется 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();
    }
}

Как я могу изменить этот код, чтобы он работал с многобайтовыми символами -?

6
задан Mike Hadlow 26 July 2012 в 14:42
поделиться