我有一个应用程序,可以从流中读取字符串数据。字符串数据通常使用英语,但有时会遇到诸如'jalapeño'和"ñ"之类的东西。在我的实现中,我更喜欢将流内容读取到字节数组中,但是我可以通过将内容阅读到字符串中来获得。知道我该怎么做才能使这项工作正确?
当前代码如下:
byte[] data = new byte[len]; // len is known a priori
byte[] temp = new byte[2];
StreamReader sr = new StreamReader(input_stream);
int position = 0;
while (!sr.EndOfStream)
{
int c = sr.Read();
temp = System.BitConverter.GetBytes(c);
data[position] = temp[0];
position++;
}
input_stream.Close();
sr.Close();
您可以将编码传递到:
中StreamReader sr = new StreamReader(input_stream, Encoding.UTF8);
但是,我知道默认情况下,根据文档。
默认使用Encoding.utf8。update
以下读取"jalapeño"很好:
byte[] bytes;
using (var stream = new FileStream("input.txt", FileMode.Open, FileAccess.Read, FileShare.Read))
{
var index = 0;
var count = (int) stream.Length;
bytes = new byte[count];
while (count > 0)
{
int n = stream.Read(bytes, index, count);
if (n == 0)
throw new EndOfStreamException();
index += n;
count -= n;
}
}
// test
string s = Encoding.UTF8.GetString(bytes);
Console.WriteLine(s);
也是如此:
byte[] bytes;
using (var stream = new FileStream("input.txt", FileMode.Open, FileAccess.Read, FileShare.Read))
{
var reader = new StreamReader(stream);
string text = reader.ReadToEnd();
bytes = Encoding.UTF8.GetBytes(text);
}
// test
string s = Encoding.UTF8.GetString(bytes);
Console.WriteLine(s);
据我了解,当文本用UTF编码存储时,文本中的"ñ"字符表示为0xC391。当您仅读取字节时,就会丢失数据。
我建议将整个流读为字节数组(第一个示例),然后进行编码。或使用StreamReader为您完成工作。
由于您试图将内容填充到字节阵列中,因此请不要对读者打扰 - 这无济于事。仅使用流:
byte[] data = new byte[len];
int read, offset = 0;
while(len > 0 &&
(read = input_stream.Read(data, offset, len)) > 0)
{
len -= read;
offset += read;
}
if(len != 0) throw new EndOfStreamException();