8

データベースからバイトストリームをコピーしてエンコードし、最後にWebページに表示しようとしています。ただし、コンテンツをさまざまな方法でエンコードするさまざまな動作に気づいています(注:ラテン文字セットを持ち、漢字をサポートしない「西ヨーロッパ」エンコードを使用しています)。

var encoding = Encoding.GetEncoding(1252 /*Western European*/);
using (var fileStream = new StreamReader(new MemoryStream(content), encoding))
{
    var str = fileStream.ReadToEnd();
}

var encoding = Encoding.GetEncoding(1252 /*Western European*/);
var str = new string(encoding.GetChars(content));

コンテンツに漢字が含まれている場合、コードの最初のブロックは「D $教学而設定计的」のような文字列を生成します。これは、エンコーディングがそれらの文字をサポートするべきではないため正しくありませんが、2番目のブロックは「D$æ•」を生成します。 ™å¦è€Œè®¾è®¡çš„ "は、すべて西ヨーロッパの文字セットに含まれているため、正しいです。

この振る舞いの違いの説明は何ですか?

4

1 に答える 1

10

StreamReaderコンストラクターは、別のエンコードを渡した場合でも、ストリーム内のBOMを検索し、それらからエンコードを設定します。

データ内のUTF8BOMを認識し、UTF8を正しく使用します。

この動作を防ぐにfalseは、3番目のパラメーターとして渡します。

var fileStream = new StreamReader(new MemoryStream(content), encoding, false)
于 2012-11-02T13:59:55.360 に答える