读取可能包含非ASCII字符的流

时间:2012-10-27 05:10:22

标签: c# stream ascii non-ascii-characters

我有一个从流中读取字符串数据的应用程序。字符串数据通常是英文的,但偶尔遇到类似'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();

2 个答案:

答案 0 :(得分:4)

您可以将encoding传递给StreamReader,如下所示:

StreamReader sr = new StreamReader(input_stream, Encoding.UTF8);

但是,据我所知,根据文档默认使用Encoding.UTF8。

<强>更新

以下内容为'Jalapeo'罚款:

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为您完成工作。

答案 1 :(得分:1)

由于您正在尝试将内容填充到字节数组中,所以不要打扰读者 - 它对您没有帮助。仅使用流:

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();