通常、バイト ストリームから文字を読み取るには、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();
}
}
マルチバイト文字で動作するようにこのコードを変更するにはどうすればよいですか?