通常、バイトストリームから文字を読み取るには、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をの内部バッファまで待たなければなりません(通常はより多くのバイトが到着したため)フラッシュされます。
この代替実装は、1バイトの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文字は1バイト以上にすることができます。 – Iridium
@TimS。どういう意味ですか?マルチバイトUTF-8文字は自動的にUTF-16文字になりません。 [Wiki](http://en.wikipedia.org/wiki/UTF-8#Description)。 – CodeCaster