pregunta:
Cuando la herramienta de rastreo web recopila automáticamente información de la página, algunas páginas parecen estar confusas. Los motivos son:
Se utilizó un tipo de codificación incorrecto para leer la información de la página. La información de codificación que C#.NET obtiene de la clase actual a veces es incorrecta. Creo que para aplicaciones que no son ASP.NET, la información de codificación que lee es incorrecta.
resolver:
Idea: primero debe obtener la codificación de la página en tiempo de ejecución y luego leer el contenido de la página, para que el contenido de la página obtenido no sea confuso.
método:
1: Utilice la codificación ASCII para leer el contenido de la página.
2: Utilice expresiones regulares para filtrar la información de codificación de la página del contenido de la página leída. La información de la página obtenida en el paso anterior puede estar confusa. Pero el marcado HTML es correcto y toda la información codificada se puede obtener del marcado HTML.
3. Utilice el tipo de codificación correcto para leer la información de la página.
Si alguien tiene un método mejor, ¡por favor ilumíneme!
El código se adjunta a continuación:
Demostración del código
usando Sistema;
usando System.Collections.Generic;
usando System.Text;
utilizando System.Net;
usando System.Web;
usando System.IO;
usando System.Text.RegularExpressions;
conjunto de caracteres del espacio de nombres
{
programa de clase
{
vacío estático principal (cadena [] argumentos)
{
URL de cadena = " http://www.gdqy.edu.cn ";
GetCharset1(url);
GetChartset2(url);
Consola.Read();
}
// Obtener la codificación de la página directamente a través de HttpWebResponse
vacío estático GetCharset1 (URL de cadena)
{
intentar
{
WebRequest webRequest = WebRequest.Create(url);
HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();
conjunto de caracteres de cadena = webResponse.CharacterSet;
cadena contentEncoding = webResponse.ContentEncoding;
string contentType = webResponse.ContentType;
Console.WriteLine("tipo de contexto:{0}", contentType
(
"charset:{0}", charset).
, codificación de contenido);
//Probar o recuperar si la página está confusa
//Console.WriteLine(getHTML(url,juego de caracteres));
}
captura (UriFormatException ex)
{
Console.WriteLine(ex.Message);
}
captura (WebException ex)
{
Console.WriteLine(ex.Message);
}
}
//Utiliza expresiones regulares para obtener la codificación de la página
vacío estático GetChartset2 (URL de cadena)
{
intentar
{
cadena html = getHTML(url,Encoding.ASCII.EncodingName);
Regex reg_charset = new Regex(@"charsetbs*=s*(?<charset>[^""]*)");
codificación de cadena = nula;
si (reg_charset.IsMatch(html))
{
enconding = reg_charset.Match(html).Groups["charset"].Value;
Console.WriteLine("charset:{0}",enconding);
}
demás
{
enconding = Codificación.Default.EncodingName;
}
//Probar o recuperar si la página está confusa
//Console.WriteLine(getHTML(url,enconding));
}
captura (UriFormatException ex)
{
Console.WriteLine(ex.Message);
}
captura (WebException ex)
{
Console.WriteLine(ex.Message);
}
}
//Leer el método del contenido de la página
cadena estática getHTML (URL de cadena, nombre de codificación de cadena)
{
intentar
{
WebRequest webRequest = WebRequest.Create(url);
WebResponse webResponse = webRequest.GetResponse();
Flujo de flujo = webResponse.GetResponseStream();
StreamReader sr = new StreamReader(flujo, Encoding.GetEncoding(encodingName));
cadena html = sr.ReadToEnd();
devolver html;
}
captura (UriFormatException ex)
{
Console.WriteLine(ex.Message);
devolver nulo;
}
captura (WebException ex)
{
Console.WriteLine(ex.Message);
devolver nulo;
}
}
}
}
El formato de codificación utilizado en la página http://www.gdqy.edu.cn es: gb2312
El contenido mostrado por el primer método es:
tipo de contexto: texto/html
juego de caracteres:ISO-8859-1
codificación de contenido:
El contenido mostrado por el segundo método es:
charset:gb2312
, por lo que la información obtenida por el primer método es incorrecta y el segundo método es correcta.
¿Por qué el formato de codificación se obtiene mediante el primer método: ISO-8859-1?
Utilicé la herramienta de reflexión Reflector para obtener el código fuente de la propiedad CharacterSet y no es difícil ver el motivo. Si pudiéramos obtener el código fuente del atributo ContentType, podríamos ver la causa del error, pero no he podido descubrirlo después de mucho tiempo. Si alguien pudiera compensarlo, lo haría. estar muy agradecido.
A continuación adjunto la herramienta de reflexión Reflector para obtener el código fuente de la propiedad CharacterSet. Los amigos que estén interesados pueden echarle un vistazo.
Código fuente del conjunto de caracteres
conjunto de caracteres de cadena pública
{
conseguir
{
this.CheckDisposed();
texto de cadena1 = this.m_HttpResponseHeaders.ContentType;
if ((this.m_CharacterSet == null) &&!ValidationHelper.IsBlankString(text1))
{
this.m_CharacterSet = cadena.Empty;
cadena texto2 = texto1.ToLower(CultureInfo.InvariantCulture);
si (texto2.Trim().StartsWith("texto/"))
{
this.m_CharacterSet = "ISO-8859-1";
}
int num1 = texto2.IndexOf(";");
si (núm1 > 0)
{
mientras ((num1 = text2.IndexOf("charset", num1)) >= 0)
{
número1 += 7;
if ((texto2[num1 - 8] == ';') || (texto2[num1 - 8] == ' '))
{
mientras ((num1 < texto2.Longitud) && (texto2[num1] == ' '))
{
número1++;
}
if ((num1 < (texto2.Longitud - 1)) && (texto2[num1] == '='))
{
número1++;
int número2 = texto2.IndexOf(';', número1);
si (núm2 > núm1)
{
this.m_CharacterSet = text1.Substring(num1, num2).Trim();
romper;
}
this.m_CharacterSet = text1.Substring(num1).Trim();
romper;
}
}
}
}
}
devolver this.m_CharacterSet;
}
http://www.cnblogs.com/xuanfeng/archive/2007/01/21/626296.html