Normalde, bir bayt akışından karakterleri okumak için bir StreamReader kullanıyorsunuz. Bu örnekte, sonsuz bir akıştan '\ r' ile sınırlandırılmış kayıtları okuyorum.UTF-8 karakterlerini sonsuz bayt akışından nasıl okuyorsunuz? 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();
}
}
}
sorunu (bu durumda '\ r') sınırlayıcı bir 'kayıt sonu' bekliyor kod sahip olduğu StreamReader iç tampon kadar beklemek eğer öyleyse StreamReader, küçük bir iç tampon olmasıdır kızardı (genellikle daha fazla bayt geldiği için).
Bu alternatif uygulama, tek bayt UTF-8 karakterleri için çalışır, ancak çok baytlı karakterler üzerinde başarısız olur.
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();
}
}
Bu kodu, çok baytlı karakterlerle çalışacak şekilde nasıl değiştirebilirim? arka arkaya, tam tampon dönüştürmek Decoder
bir örneğini elde etmek için tasarlanmış ve
başlık söylemek değiştirilemez olmamalı multi-byte veya UTF-16 karakter yerine UTF-8? Yanıltıcı görünüyor. –
@TimS. UTF-8 karakterleri tek bir bayttan daha fazlası olabilir. – Iridium
@TimS. ne demek istiyorsun? Çok baytlı bir UTF-8 karakteri, otomatik olarak bir UTF-16 karakterine dönüşmez. [Wiki] (http://en.wikipedia.org/wiki/UTF-8#Description). – CodeCaster