Pregunta

De acuerdo con lo siguiente mesa Para el ISO-8859-1 estándar, parece haber un nombre de entidad y un número de entidad asociados con cada carácter HTML reservado.

Así, por ejemplo, para el personaje é :

Nombre de la entidad : é

Número de entidad: é

De manera similar, para el personaje > :

Nombre de la entidad : >

Número de entidad: >

Para una cadena dada, la HttpUtility.HtmlEncode devuelve una cadena codificada en HTML, pero no puedo entender cómo funciona.Esto es lo que quiero decir:

Console.WriteLine(HtmlEncode("é>"));
//Outputs é>

Parece estar usando el número de entidad para el é carácter sino el nombre de la entidad para el > personaje.

Entonces, ¿el método HtmlEncode realmente funciona con el estándar ISO-8859-1?Si es así, ¿hay alguna razón por la que a veces utiliza el nombre de la entidad y otras veces el número de la entidad?Más importante aún, ¿puedo obligarlo a que me dé el nombre de la entidad de manera confiable?

EDITAR :Gracias por la respuesta chicos.Sin embargo, no puedo decodificar la cadena antes de realizar la búsqueda.Sin entrar en demasiados detalles, el texto se almacena en una lista de SharePoint y la "búsqueda" la realiza el propio SharePoint (mediante una consulta CAML).Básicamente, no puedo.

Estoy tratando de pensar en una forma de convertir los números de entidad en nombres. ¿Existe alguna función en .NET que haga eso?¿O alguna otra idea?

¿Fue útil?

Solución

Así es como se ha implementado el método. Para algunos personajes conocidos, utiliza la entidad correspondiente y para todo lo demás utiliza el valor hexadecimal correspondiente y no hay mucho que pueda hacer para modificar este comportamiento. Extracto de la implementación de System.Net.WebUtility.HtmlEncode (como se ve con el reflector):

...
if (ch <= '>')
{
    switch (ch)
    {
        case '&':
        {
            output.Write("&amp;");
            continue;
        }
        case '\'':
        {
            output.Write("&#39;");
            continue;
        }
        case '"':
        {
            output.Write("&quot;");
            continue;
        }
        case '<':
        {
            output.Write("&lt;");
            continue;
        }
        case '>':
        {
            output.Write("&gt;");
            continue;
        }
    }
    output.Write(ch);
    continue;
}
if ((ch >= '\x00a0') && (ch < 'Ā'))
{
    output.Write("&#");
    output.Write(((int) ch).ToString(NumberFormatInfo.InvariantInfo));
    output.Write(';');
}
...

Dicho esto, no debe importarle, ya que este método siempre producirá HTML válido, seguro y correctamente codificado.

Otros consejos

HtmlEncode es Siguiendo la espec. El estándar ISO especifica tanto un nombre como un número para cada entidad, y el nombre y el número son equivalentes. Por lo tanto, una implementación conforme de HtmlEncode es libre de codificar todos los puntos como números, o todos como nombres, o alguna mezcla de los dos.

Le sugiero que aborde su problema desde la otra dirección: llamar HtmlDecode En el texto de destino, luego busque a través del texto decodificado usando la cadena RAW.

ISO-8859-1 no es realmente relevante para la codificación de caracteres HTML.De Wikipedia:

Las referencias numéricas siempre se refieren a los puntos de código Unicode, independientemente de la codificación de la página.

Sólo para puntos de código Unicode no definidos se suele utilizar ISO-8859-1:

El uso de referencias numéricas que se refieren a caracteres y caracteres de control permanentemente indefinidos está prohibido, con la excepción de los caracteres de la alimentación de línea, la pestaña y el retorno del carro.Es decir, los caracteres en los rangos hexadecimales 00–08, 0b - 0c, 0e - 1f, 7f y 80–9f no pueden usarse en un documento HTML, ni siquiera por referencia, por lo que "™", por ejemplo, no está permitido .Sin embargo, para la compatibilidad hacia atrás con los primeros autores y navegadores HTML que ignoraron esta restricción, los caracteres en bruto y las referencias de caracteres numéricos en el rango 80-9F son interpretadas por algunos navegadores que representan los caracteres mapeados a los bytes 80-9F en la codificación Windows-1252.

Ahora para responder a tu pregunta:Para que la búsqueda funcione mejor, debería buscar en HTML no codificado (eliminando primero las etiquetas HTML) utilizando una cadena de búsqueda no codificada.La coincidencia de cadenas codificadas generará resultados inesperados, como visitas basadas en etiquetas HTML o comentarios, y visitas faltantes debido a diferencias en el HTML que son invisibles en el texto.

Hice esta función, creo que ayudará

        string BasHtmlEncode(string x)
        {
           StringBuilder sb = new StringBuilder();
           foreach (char c in x.ToCharArray())
               sb.Append(String.Format("&#{0};", Convert.ToInt16(c)));
           return(sb.ToString());
        }

Desarrollé el siguiente código para mantener AZ, AZ y 0-1 no codificados pero descansar:

public static string Encode(string source)
{
    if (string.IsNullOrEmpty(source)) return string.Empty;

    var sb = new StringBuilder(source.Length);
    foreach (char c in source)
    {
        if (c >= 'a' && c <= 'z')
        {
            sb.Append(c);
        }
        else if (c >= 'A' && c <= 'Z')
        {
            sb.Append(c);
        }
        else if (c >= '0' && c <= '9')
        {
            sb.Append(c);
        }
        else
        {
            sb.AppendFormat("&#{0};",Convert.ToInt32(c));
        }
    }

    return sb.ToString();
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top