2

ストリームから文字列データを読み取るアプリケーションがあります。通常、文字列データは英語ですが、「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();
4

2 に答える 2

4

次のように、エンコーディングを StreamReader に渡すことができます。

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

ただし、ドキュメントによると、デフォルトで Encoding.UTF8 が使用されることは理解しています。

アップデート

以下は '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 として表されます。1 バイトしか読み取らないと、データが失われます。

ストリーム全体をバイト配列として読み取り (最初の例)、エンコードを行うことをお勧めします。または、StreamReader を使用して作業を行ってください。

于 2012-10-27T05:29:58.587 に答える
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();
于 2012-10-27T07:26:03.593 に答える