2014-12-24 11 views
5

Dlaczego pokazuje znaki zapytania w oknie komunikatu zamiast tekstuDlaczego pokazują znaki zapytania w oknie komunikatu zamiast tekstu

enter image description here

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://teamxor.net/vb/tx48/"+ page); 

HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 

StreamReader sr = new StreamReader(response.GetResponseStream()); 

string result = sr.ReadToEnd(); 

Regex r = new Regex("<div>.*?</div>"); 
MatchCollection mr = r.Matches(result); 

foreach (Match m in mr) 
{ 
    MessageBox.Show(m.Value, "Test", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, MessageBoxOptions.RtlReading); 
}  
+1

Brzmi jak problem z kodowaniem. Czy możesz również pokazać swoją pracę? –

+4

Użyj Unicode, Luke. –

+0

Sprawdź czcionkę i kodowanie. – danish

Odpowiedz

5

Problem polega na zastosowaniu niebędących -default strony kodowej. Twój HTML pokazuje używasz strony kodowej 1256. Trzeba powiedzieć, .NET, że jeszcze myśli, że jest UTF-8:

StreamReader sr = new StreamReader(response.GetResponseStream() 
            , Encoding.GetEncoding(1256) // <-- this one 
           ); 

Zastosowanie Encoding.GetEncoding aby uzyskać właściwą stronę kodową. Sugeruję użycie zamiast tego UTF8, ponieważ jest to łatwo rozpoznawane przez .NET.

+1

W rzeczywistości, ponieważ jest to WebResponse, OP powinien zawsze sprawdzać i używać nagłówka 'charset' –

+0

Zadziwiające dzięki :) –

+0

@PanagiotisKanavos: Masz na myśli nagłówek HTML? Myślę, że już w tej chwili jest za późno. –

4

Serwery sieci Web mogą zwracać odpowiedź w dowolnym kodowaniu, ale zazwyczaj wybierają kodowanie zgodne z preferowanym językiem przeglądarki.

Używane kodowanie jest zwracane jako element charset nagłówka . W .NET można pobrać kodowanie używane z właściwości HttpWebResponse.CharacterSet. Możesz użyć zwróconego zestawu znaków do skonstruowania obiektu kodowania, który będzie używany do odczytu odpowiedzi:

var charset= response.CharacterSet; 
var encoding = Encoding.GetEncoding(charset); 
var sr= new StreamReader(response.GetResponseStream(),encoding); 
.... 
Powiązane problemy