2011-08-04 9 views
3

サイトからの応答を読み取っているストリームがあります。私はそのストリームをテキストファイルのテキストに保存します。2つの異なるストリームからの2つの文字列を比較することは同じではありません。

これをもう一度実行して、同じサイトの文字列とファイルに保存されているテキストを比較すると、それらは異なると考えられます。

WinMergeのようなdiffツールで2つの文字列を比較すると、明らかに同じ点で違いが見つかります。

何が起こっていますか?彼らはどちらもデフォルトのUTF8エンコーダを使用しています。

私はこれを実行するのが難しいかもしれないことを感謝しますので、私はあなたのための実例を書いています。ここ

は一例であり:WinMergeのによって報告されるようにここ

 var request = WebRequest.Create("http://www.google.com"); 
     using (var response = request.GetResponse()) 
     using (var body = response.GetResponseStream()) 
     using (var googReader = new StreamReader(body)) 
     using (var googFileStream = File.Open("goog.txt", FileMode.OpenOrCreate)) 
     using (var fileReader = new StreamReader(googFileStream)) 
     { 
      var googText = googReader.ReadToEnd(); 
      var fileText = fileReader.ReadToEnd(); 
      if (!string.Equals(googText, fileText)) 
      { 
       googFileStream.Dispose(); 
       using (var msnWriter = new StreamWriter(File.Open("goog.txt", FileMode.Create))) 
       { 
        msnWriter.Write(googText); 
       } 
      } 
     } 

は明らかで '差' です。それは明らかにhtmlの間のポイントです。文字セット:

+1

強調表示されたテキスト全体の画像を投稿できますか?それは他の場所かもしれません。上に進むべきことがなければ、私は、単一のエンコーディング内であっても、1つのスペースとして読まれる2つの異なるコードがあることを伝えることができます。基本的な "スペース"(10進コード32)と "非改行スペース"(コード255)があります。 「ユニットセパレータ」のような特定の制御コードは、テキストレンダラに応じてスペースとして読み取ることもできます。コードが異なる場合、見た目が同一であっても文字列は異なります。 – KeithS

+0

2つのファイルを16進表示で表示して、そこにページが表示されていないことを確認できますか? – GrandMasterFlush

+0

@KeithSオリジナルは巨大です - それはGoogleのホームページからのソースです。このファイルは、数秒前にサイトから来たもののコピーであることを忘れないでください。文字列を保存するときにスペースを非改行スペースに変換する方法で保存した可能性はありますか? – BritishDeveloper

答えて

4

コードは正常です。あなたがリクエストを送るたびにGoogleが実際には異なる内容を返すということだけです。それ以外の場合は、コードを簡素化し、毎回異なる内容を返さないサイトを使用することもできます。

var file = "goog.txt"; 
using (var client = new WebClient()) 
{ 
    var data = client.DownloadString("http://www.google.com"); 
    if (!File.Exists(file) || !string.Equals(File.ReadAllText(file), data)) 
    { 
     File.WriteAllText(file, data); 
    } 
} 
+1

まさに正しい - スクリプトブロックの1つには、すべてのリクエスト。したがって、ストリームは2つの別個のWeb要求の間で決して一致することはありません。また、ソースを完全に制御してパイプラインをレンダリングしない限り、決して行われてはなりません。 – GalacticCowboy

+0

あなたは正しいです。非常に単純なコードのための歓声:) – BritishDeveloper

関連する問題