通常,要從字節流中讀取字符,請使用StreamReader。在這個例子中,我正在讀取由無限流中'\ r'分隔的記錄。如何從無限字節流中讀取UTF-8字符 - C#
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?似乎有誤導性。 – 2012-07-26 14:45:19
@TimS。 UTF-8字符可以多於一個字節。 – Iridium 2012-07-26 14:46:37
@TimS。你什麼意思?多字節UTF-8字符不會自動成爲UTF-16字符。 [維基](http://en.wikipedia.org/wiki/UTF-8#Description)。 – CodeCaster 2012-07-26 14:46:47