我有一个包含一些文本数据的Stream(可以是ASCII,UTF-8,Unicode;编码已知)。我需要从流中读取一个字符,而不再提升流位置。 StreamReader是不合适的,因为它积极地从流中预取数据 想法?
答案 0 :(得分:2)
如果你想一次读取和解码一个字节的文本,我所知道的最方便的方法是使用System.Text.Decoder类。
这是一个简单的例子:
class Program
{
static void Main(string[] args)
{
Console.OutputEncoding = Encoding.Unicode;
string originalText = "Hello world! ブ䥺ぎょズィ穃 槞こ廤樊稧 ひゃご禺 壪";
byte[] rgb = Encoding.UTF8.GetBytes(originalText);
MemoryStream dataStream = new MemoryStream(rgb);
string result = DecodeOneByteAtATimeFromStream(dataStream);
Console.WriteLine("Result string: \"" + result + "\"");
if (originalText == result)
{
Console.WriteLine("Original and result strings are equal");
}
}
static string DecodeOneByteAtATimeFromStream(MemoryStream dataStream)
{
Decoder decoder = Encoding.UTF8.GetDecoder();
StringBuilder sb = new StringBuilder();
int inputByteCount;
byte[] inputBuffer = new byte[1];
while ((inputByteCount = dataStream.Read(inputBuffer, 0, 1)) > 0)
{
int charCount = decoder.GetCharCount(inputBuffer, 0, 1);
char[] rgch = new char[charCount];
decoder.GetChars(inputBuffer, 0, 1, rgch, 0);
sb.Append(rgch);
}
return sb.ToString();
}
}
据推测,您已经意识到一次只处理一个字节处理任何类型数据的缺点。 :)我只想说,这不是一种非常有效的做事方式。