2017-04-18 15 views
0

私はHtmlAgilityPackを使用していくつかのサイトからメタ記述を読んでいます。C#で非アスキー文字をデコードしていますか?

英語の文字でない場合は、特殊文字をデコードしないことに気付きました。 (日本の手紙など)。

私はエンコードUTF8を使用しています。何か他のものを使用していなければなりません。

byte[] bytes = Encoding.Default.GetBytes(item.Attributes["content"].Value); 
return Encoding.UTF8.GetString(bytes); 
+2

なぜあなたはまったく 'Encoding.Default'を使用していますか?なぜあなたは 'return item.Attributes [" content "]をしていないのですか? –

+0

item.Attributes ["content"]。Valueを返すだけであれば、Japanesesの文字は表示されません。 v ̌ R 〜 @ScottChamberlain – Ben

+0

どのように表示していますか?そのコードを表示します。また、 'Value'によって返された' string'オブジェクトもチェックしてください。デバッガの文字列を調べることで正しい値を持っているかどうか確認してください。それが正しい値を持っていない場合は、さらに元に戻って、 'item'があなたのデータソースが何であっても解析しない理由を理解する必要があります。 –

答えて

0

お客様のコメントによると、あなたのウェブサイトはUTF-8ではなくSHIFT-JISエンコードを使用しているようです。 UTF-8とSHIFT-JISのサンプルを2つ追加しました。

 using (var client = new WebClient()) 
     { 
      // UTF-8 
      var content = client.DownloadString("http://www3.nhk.or.jp/news/"); 
      var doc = new HtmlDocument(); 
      doc.LoadHtml(content); 
      var metaDescNode = doc.DocumentNode.SelectSingleNode("//meta[@name=\"description\"]"); 
      var bytes = Encoding.Default.GetBytes(metaDescNode.Attributes["content"].Value); 
      var decodedMetaDesc = Encoding.UTF8.GetString(bytes); // This string has decoded characters 

      // Shift_JIS 
      var japaneseEncoding = Encoding.GetEncoding(932); 
      var content2 = client.DownloadString("http://www.toronto-electricians.com/"); 
      var doc2 = new HtmlDocument(); 
      doc2.LoadHtml(content2); 
      var metaDescNode2 = doc2.DocumentNode.SelectSingleNode("//meta[@name=\"description\"]"); 
      var bytes2 = Encoding.Default.GetBytes(metaDescNode2.Attributes["content"].Value); 
      var decodedMetaDesc2 = japaneseEncoding.GetString(bytes2); // This string has decoded characters 
     } 

スクリーンショット1デバッガから。デバッガから

enter image description here

スクリーンショット#2。

enter image description here

+0

サンプルで使用したサイトでコードが動作します。私は別のウェブサイト 'http:// www。toronto-electricians.com/'と v ̌ R 〜showsを表示します。自分のサイトでコードを実行できますか?それは大丈夫ですか? – Ben

+0

ああ!あなたのサイトは "Shift_JIS"文字セットを使用していますので、私のコードを更新してください。 – Ignas

+0

@Benは更新されたコードを参照してください。 – Ignas

1

WebClient.DownloadStringは基本的に簡単な事をすることは厄介で間違いやすい作る限られた、ハイレベルな方法です。

HTTP経由でWebページを取得するのは簡単です。あなたはURLといくつかのリクエストヘッダを与えます。サーバーは、応答ヘッダーと本文のバイトストリームで応答します。応答ヘッダは通常、テキスト本文の文字エンコーディングを記述します。もしそうでなければ、本文はそれ自身を言うかもしれません。 HTMLAgilityPackはこれを理解し、そのインタラクションからHtmlAgilityPack.HtmlDocumentを作成するためのHtmlWebクラスを提供します。

var document = new HtmlWeb().Load("http://www3.nhk.or.jp/news/"); 
var keywords = document.DocumentNode 
    .SelectSingleNode("//meta[@name='keywords']") 
    .Attributes["content"]?.Value; 
Console.WriteLine(keywords); 
Console.WriteLine([email protected]" 
    StreamEncoding: {document.StreamEncoding?.EncodingName} 
    DeclaredEncoding: {document.DeclaredEncoding?.EncodingName} 
    Encoding:   {document.Encoding?.EncodingName}"); 

NHK,ニュース,NHK NEWS WEB 

    StreamEncoding: Unicode (UTF-8) 
    DeclaredEncoding: 
    Encoding:   Unicode (UTF-8) 
+0

URLを使用してコードを実行しようとしました。「http:// www.toronto-electricians.com /」SHIFT-JISエンコーディングが動作しません。返信 ̉ グ – Ben

+0

@Ben私は困惑しています今のところは。私はあなたのページを[W3Cバリデーター]に入れました(https://validator.w3.org/check?uri=http%3A%2F%2Fwww.toronto-electricians.com%2F&charset=%28detect+automatically%29&fbc=1&doctype = 1&ss = 1&outline = 1&No200 = 1&verbose = 1)、XHTMLで失敗します。しかし、HtmlAgilityPackに文字をマングルさせる原因となるものは何も出ていません。 –

+0

@Benでは、階層化された仕様を解析するのは難しいですが、サーバーが文字セット宣言なしでHTTP Content-Typeヘッダーを送信しています。 charset宣言を持つHTTP Content-Typeヘッダーは、HTML/XHTMLメタ文字セット宣言を上書きします。ヘッダーは存在していますが、文字セットが指定されていない場合は、デフォルトのUTF-8でオーバーライドされている可能性があります。 Content-Typeヘッダーに文字セットを含めるようにサーバーを変更できますか? –

関連する問題