2

現在、次のコードを使用して HTML ページをダウンロードしています。

Try
    Dim req As System.Net.HttpWebRequest = DirectCast(WebRequest.Create(URL), HttpWebRequest)
    req.Method = "GET"
    Dim resp As Net.HttpWebResponse = DirectCast(req.GetResponse(), Net.HttpWebResponse)
    Dim stIn As IO.StreamReader = New IO.StreamReader(resp.GetResponseStream())
    Dim strResponse As String = stIn.ReadToEnd

    ''Clean up
    stIn.Close()
    stIn.Dispose()
    resp.Close()

    Return strResponse

Catch ex As Exception
    Return ""
End Try

これはほとんどのページでうまく機能しますが、一部のページ (例: www.gap.com) では、応答が正しくエンコードされていません。
たとえば、gap.com では、「'」が「?」として表示されます。
google.cn を読み込もうとするとどうなるかは言うまでもありません...

.Netにこれを正しくエンコードさせるために、ここで何が欠けていますか?

私の最悪の恐怖は、エンコーディングを指定した HTML 内のメタ タグを実際に読み取ってから、ストリーム全体を再読み取り (再エンコード?) する必要があることです。

どんなポインタでも大歓迎です。


アップデート:

John Saunders の返信のおかげで、私は少し近づいています。HttpWebResponse.ContentEncoding プロパティは常に空になるようです。ただし、HttpWebResponse.CharacterSet は便利なようで、このコードを使用すると、次のようになります。

Dim resp As Net.HttpWebResponse = DirectCast(req.GetResponse(), Net.HttpWebResponse)
Dim respEncoding As Encoding = Encoding.GetEncoding(resp.CharacterSet)
Dim stIn As IO.StreamReader = New IO.StreamReader(resp.GetResponseStream(), respEncoding)

これで、Google.cn はすべての漢字で完璧に機能します。
しかし、Gap.Com はまだ間違っています。

Gap.com の場合、HttpWebResponse.CharacterSet は ISO-8859-1 であり、GetEncoding を介して取得しているエンコーディングは {System.Text.Latin1Encoding} であり、ボディ名に「ISO-8859-1」と表示され、さらに Content- 「charset=ISO-8859-1」を指定したHTMLにMETAタグを打ち込みます。

私はまだ何か間違ったことをしていますか?
それとも GAP が何か間違ったことをしているのですか?

4

3 に答える 3

2

HttpWebResponse には ContentEncoding プロパティがあると思います。StreamReader のコンストラクターで使用します。

于 2009-03-12T14:10:10.470 に答える
1

ギャップのサイトは間違っています。特定の問題は、ページがLatin1(ISO-8859-1)のエンコーディングを要求しているのに対し、ページはISO-8859-1では無効な文字#146を使用していることです。

ただし、その文字はWindows CP-1252エンコーディング(ISO 8859-1のスーパーセット)では有効です。CP-1252では、文字コード#146であり、右引用符文字に使用されます。これは、Gap.comホームページの今日のテキストの「小柄で小さいサイズが見つかります」のアポストロフィとして表示されます。

あなたは読むことができます詳細については、 http://en.wikipedia.org/wiki/Windows-1252を参照してください。この種の問題は、コンテンツが元々CP-1252エンコーディングで保存されていたWebページ(Wordからのコピー/貼り付けなど)でよくある問題であることがわかりました。

ここでの話の教訓:常に国際化されたテキストをUnicodeとしてデータベースに保存し、HTMLを常にUTF8としてWebサーバーに出力します。

于 2009-08-14T21:07:32.150 に答える
0

ダニエル、一部のページは値を返さCharacterSetないため、このアプローチはあまり信頼できません. ブラウザーでさえ、どのエンコーディングを使用するかを「推測」できない場合があるため、100% のエンコーディング認識を行うことはできないと思います。

私の特定のケースでは、スペイン語またはポルトガル語のページを扱っているため、UTF7エンコーディングを使用しており、問題なく動作しています (áéíóúñÑêã... など)。

最初に、CharacterSet コードとそれに対応するエンコーディングのテーブルをロードできます。CharacterSet が空の場合は、デフォルトのエンコーディングを指定できます。

コンストラクターのdetectEncodingFromByteOrderMarksパラメーターは、StreamReader最初のバイトからいくつかのエンコーディングを自動的に検出または推測するため、少し役立つ場合があります。

于 2009-05-19T04:50:46.063 に答える