Hola
Pues el asunto ya lo explica todo. Extraigo el código de una página web y no aparecen caracteres especiales como los acentos y creo que la 'ñ' tampoco.
Mi código es el siguiente:
Dim UrlCode As String = Nothing
Dim myHttpWebRequest As System.Net.HttpWebRequest = _
CType(System.Net.WebRequest.Create("https://foro.elhacker.net/net/el_codigo_html_extraido_de_una_web_no_muestra_acentos_aeo-t444215.0.html;msg2046878#msg2046878"), _
System.Net.HttpWebRequest)
myHttpWebRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727)" '".NET Framework Test Client"
' The response object of 'HttpWebRequest' is assigned to a 'HttpWebResponse' variable.
Dim myHttpWebResponse As System.Net.HttpWebResponse = CType(myHttpWebRequest.GetResponse(), System.Net.HttpWebResponse)
' Display the contents of the page to the console.
Dim streamResponse As System.IO.Stream = myHttpWebResponse.GetResponseStream()
Dim streamRead As New System.IO.StreamReader(streamResponse)
UrlCode = streamRead.ReadToEnd
streamRead.Close()
streamResponse.Close()
myHttpWebResponse.Close()
En lugar del acento aparece un cuadrito 'cami[]n'
Gracias
Ya lo solucioné, añadiendo System.Text.Encoding.
Dim streamRead As New System.IO.StreamReader(streamResponse, System.Text.Encoding.GetEncoding(1252))
También me ha servido poner System.Text.Encoding.Default
Dim streamRead As New System.IO.StreamReader(streamResponse, System.Text.Encoding.Default)
Parece ser que es debido a la conversión de la Web a Unicode que hace Net.
Debes utilizar la codificación de caracteres adecuada, la misma en la que está escrito el documento Html, en este caso, CP1252 (o Windows-1252).
Encoding.GetEncoding(name:="windows-1252")
Aparte de eso, el código lo tenías un poco "sucio", aquí tienes:
Dim sourceCode As String
Dim url As String = "https://foro.elhacker.net/net/el_codigo_html_extraido_de_una_web_no_muestra_acentos_aeo-t444215.0.html;msg2046878#msg2046878"
Dim enc As Encoding = Encoding.GetEncoding(name:="windows-1252")
Dim req As HttpWebRequest = DirectCast(WebRequest.Create(url), HttpWebRequest)
req.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727)" '".NET Framework Test Client"
Using resp As HttpWebResponse = DirectCast(req.GetResponse, HttpWebResponse)
Using sr As New StreamReader(resp.GetResponseStream, enc)
sourceCode = sr.ReadToEnd
End Using
End Using
Nota: Te sugiero limpiar el código en el contexto de importar los namespaces necesaros para no llenar todo el código de nombres de miembros excesivamente repetitivos, eso lo vuelve muy tedioso de leer.
Imports System.IO
Imports System.Net
Imports System.Text
Cita de: Lekim en 12 Noviembre 2015, 11:15 AMTambién me ha servido poner System.Text.Encoding.Default
Dim streamRead As New System.IO.StreamReader(streamResponse, System.Text.Encoding.Default)
Ten cuidado con
System.Text.Encoding.Default, en este caso te funciona por que el código de página o codepage por defecto del sistema (de tu sistema), es el mismo que el de la web a la que le haces el request, pero no siempre será así.
Saludos
Gracias
Bueno, el código es en realidad prácticamente un copia y pega del MSDN :P
Lo estaba arreglando de la siguiente manera:
Dim UrlCode As String = Nothing
Dim myHttpWebRequest As System.Net.HttpWebRequest = _
CType(System.Net.WebRequest.Create("https://foro.elhacker.net/net/el_codigo_html_extraido_de_una_web_no_muestra_acentos_aeo-t444215.0.html;msg2046878#msg2046878"), _
System.Net.HttpWebRequest)
myHttpWebRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727)" '".NET Framework Test Client"
' "Mozilla/4.0 (compatible; MSIE 6.0b; Windows NT 5.1)"
myHttpWebRequest.Method = "GET"
myHttpWebRequest.Timeout = 10000
myHttpWebRequest.ProtocolVersion = System.Net.HttpVersion.Version10
Dim myHttpWebResponse As System.Net.HttpWebResponse = CType(myHttpWebRequest.GetResponse(), System.Net.HttpWebResponse)
Dim streamResponse As System.IO.Stream = myHttpWebResponse.GetResponseStream()
Dim streamRead As System.IO.StreamReader = Nothing
If Not IsNothing(streamResponse) Then
Try
streamRead = New System.IO.StreamReader(streamResponse, System.Text.Encoding.Default) 'System.Text.Encoding.GetEncoding(name:="windows-1252")
' Lea y devuelva todo el contenido de la cadena.
UrlCode = streamRead.ReadToEnd
Catch ex As Exception
Throw New Exception()
Finally
streamRead.Close()
streamResponse.Close()
myHttpWebResponse.Close()
End Try
End If
También vale?
Lo de no importar es una manía mía, porque me gusta saber de donde vienen las clases.
Ok gracias, pondré Windows-1252
Cita de: Lekim en 12 Noviembre 2015, 11:43 AMTambién vale?
No, no me vale. Estás haciendo uso de málas prácticas, desaprovechando las ventajas del lenguaje utilizando métodos deprecados para llevar a cabo las cosas.
1. Usa la directiva
Usings, esto aporta la ventaja de evitar bloques Try/Catch innecesarios, y mayor seguridad en general.
2. Usa
IsNot Nothing en lugar de
Not IsNothing()3. Usa
DirectCast para asumir de forma implícita el casting sin evaluaciones innecesarias, en lugar de
CType, es algo innecesario en tu código y consume más tiempo, ya que ambos trabajan de manera distinta.
4. En tu bloque Try/Catch, estás lanzando una nueva excepción, no la excepción capturada en la expresión
Catch.
Incorrecto:
Catch ex As Exception
Throw New Exception
No del todo correcto:
Catch
Throw
Tampoco del todo correcto:
Catch ex As Exception
Throw ex
Correcto:
Catch ex As Exception
Throw
También correcto:
Catch ex As Exception
Throw New Exception("Mensaje personalizado", innerException:=ex)
Saludos