2009-03-12 31 views
2

doğru kodlama ile yanıt alma:HttpWebRequest: Şu anda aşağıdaki kodu kullanarak, bir HTML sayfası indiriyorum

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 

Bu çoğu sayfalarında iyi sonuç verir, ancak bazı (örn: www.gap.com), Yanıt yanlış kodlanmış olsun.
gap.com'da, örneğin, "" olarak "?"
Ve google.cn ...

Yüklemeye çalıştığınızda ne olacağını söylememe gerek yok. Bu kodu kodlamak için .Net'i almak için ne arıyorum?

En büyük korkum şudur ki, aslında kodlamada belirtilen HTML içindeki meta etiketi okumalı ve ardından tüm akışı yeniden okumalıyım (yeniden kodlamak mı?).

Herhangi bir işaretçi büyük takdir edilecektir.


GÜNCELLEME: John Saunders' yanıtına karşılık

sayesinde ben biraz daha yakın değilim. HttpWebResponse.ContentEncoding özelliği her zaman boş gibi görünüyor. Ancak, HttpWebResponse.CharacterSet kullanışlı görünüyor ve daha yakın bu kodla i alıyorum:

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) 

Şimdi Google.cn tüm çince karakterler ile mükemmel geliyor.
Ancak, Gap.Com hala yanlış geliyor.

Gap.com için, HttpWebResponse.CharacterSet, ISO-8859-1'dir, GetEncoding uygulamasından geçmekte olduğum Kodlama, "ISO-8859-1" ifadesini gövde adıyla anlatan {System.Text.Latin1Encoding} VE HTML’deki Content-Type META etiketinde "charset = ISO-8859-1" belirtildi.

Hala yanlış bir şeyler yapıyorum?
Yoksa GAP bir şeyler mi yapıyor?

cevap

1

Gap'ın sitesi yanlış. Buradaki problem, sayfalarının Latin1 (ISO-8859-1) kodlamasını, sayfa ise ISO-8859-1'de geçerli olmayan # 146 karakterini kullanmasıdır.Bununla birlikte, bu karakter Windows CP-1252 kodlamasında geçerlidir (ISO 8859-1'in bir üst kümesidir). CP-1252'de, karakter kodu # 146 ve sağ-alıntı karakteri için kullanılır. Bunu, Gap.com ana sayfasındaki bugünkü metinde "Youll find Petites ve küçük boyutlarda" bir kesme işareti olarak göreceksiniz.

Daha fazla ayrıntı için http://en.wikipedia.org/wiki/Windows-1252 belgelerini okuyabilirsiniz. Bu tür bir şey, içeriğin orijinal olarak CP-1252 kodlamasına (örneğin, Word'den kopya/yapıştırılmış) kaydedildiği web sayfalarında yaygın bir sorundur.

Hikayenin ahlakı: her zaman veritabanında Unicode olarak uluslararası metni saklayın ve web sunucunuzda her zaman HTML'yi UTF8 olarak yayınlayın!

2

HttpWebResponse'nin bir ContentEncoding özelliğine sahip olduğuna inanıyorum. StreamReader'ınızın yapıcısında kullanın.

0

Daniel, Bazı sayfalar, CharacterSet'da bir değer bile döndürmez, bu nedenle bu yaklaşım çok güvenilir değildir. Bazen tarayıcılar bile Kodlamanın kullanabileceğini "tahmin edemez", bu yüzden% 100 koşullu bir tanıyacağınızı düşünmüyorum. Ben ispanyolca veya portekizce sayfaları ile uğraşmak benim özel durumda

, ben UTF7 kodlamasını kullanır ve onu (áéíóúñÑêã ... vb) benim için iyi çalışıyor.

İlk olarak bir CharacterSet kodları tablosu ve bunlara karşılık gelen Kodlama yüklenebilir. Ve CharacterSet'in boş olması durumunda, bir Varsayılan kodlama sağlayabilirsiniz.

StreamReader yapıcısındaki detectEncodingFromByteOrderMarks parametresi, ilk bayttan bazı kodlamaları otomatik olarak algıladığı veya belirlediği için yardımcı olabilir.

İlgili konular