Question

Selon le pour le http: // www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=28245" rel = « noreferrer »> ISO-8859-1 standard , il semble y avoir un nom d'entité et un numéro d'entité associée à chaque caractère réservé HTML.

Ainsi, par exemple, pour le caractère é:

Nom de l'entité: é

Entité numéro: é

De même, pour le caractère >:

Nom de l'entité: >

Entité numéro: >

Pour une chaîne donnée, le HttpUtility.HtmlEncode renvoie un HTML codé chaîne , mais je ne peux pas comprendre comment cela fonctionne. Voici ce que je veux dire:

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

Il semble utiliser le numéro d'entité pour le caractère é mais le nom de l'entité pour le caractère >.

fait la méthode HtmlEncode vraiment de travail avec la norme ISO-8859-1? Dans le cas contraire, est-il une raison pour laquelle il utilise parfois le nom de l'entité et d'autres fois le numéro d'entité? Plus important encore, je peux le forcer à me donner de manière fiable le nom de l'entité?

EDIT: Merci pour les réponses les gars. Je ne peux pas décoder la chaîne avant d'effectuer la recherche bien. Sans entrer dans trop de détails, le texte est stocké dans une liste SharePoint et la « recherche » est fait par SharePoint lui-même (en utilisant une requête CAML). Donc, fondamentalement, je ne peux pas.

Je suis en train de penser à un moyen de convertir les nombres d'entités en noms, est-il une fonction dans .NET qui fait cela? Ou toute autre idée?

Était-ce utile?

La solution

Voilà comment la méthode a été mise en œuvre. Pour certains personnages connus, il utilise l'entité correspondante et pour tout le reste, il utilise la valeur hexadécimale correspondante et il n'y a pas grand-chose que vous pouvez faire pour modifier ce comportement. Extrait de la mise en œuvre de System.Net.WebUtility.HtmlEncode (comme on le voit avec réflecteur):

...
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(';');
}
...

Ceci étant dit que vous ne devriez pas prendre soin que cette méthode produira toujours valide, HTML sûr et codé correctement.

Autres conseils

HtmlEncode suivant la spécification. La norme ISO prévoit à la fois un nom et un numéro pour chaque entité, et le nom et le numéro sont équivalentes. Par conséquent, une mise en œuvre conforme de HtmlEncode est libre d'encoder tous les points que les nombres, ou tous les noms, ou un mélange des deux.

Je suggère que vous vous approchez de votre problème dans l'autre sens. HtmlDecode d'appel sur le texte cible, puis rechercher dans le texte décodé en utilisant la chaîne brute

ISO-8859-1 est pas vraiment pertinent pour le codage des caractères HTML. Un article de Wikipédia:

Les références numériques se réfèrent toujours à points de code Unicode, quel que soit le encodage de page.

Seulement pour le code Unicode non défini indique ISO-8859-1 est souvent utilisé:

Utilisation numérique références qui se réfèrent à de façon permanente caractères non définis et le contrôle caractères est interdite, la exception du saut de ligne, onglet, caractères chariot de retour. C'est, caractères dans les plages hexadécimaux 00-08, 0B-0C, 0E-1F, 7F et 80-9F ne peut pas être utilisé dans un document HTML, pas même par référence, donc « ™ », par exemple, ne sont pas autorisés. cependant, pour la compatibilité descendante avec début auteurs HTML et les navigateurs ignorés cette restriction, caractères bruts et références numériques de caractères dans la gamme 80-9F sont interprétées par certains navigateurs comme représentant les caractères mis en correspondance avec octets 80-9F dans l'encodage Windows 1252.

Maintenant, pour répondre à votre question: Pour la recherche de travailler mieux, vous devriez vraiment rechercher le HTML non codé (stripping les balises HTML première) en utilisant une chaîne de recherche non codée. Correspondance de chaînes codées conduiront à des résultats inattendus, comme les hits selon des balises HTML ou des commentaires et coups manquants en raison des différences dans le code HTML qui sont invisibles dans le texte.

J'ai fait cette fonction, je pense que ça va aider

        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());
        }

I développés code ci-dessous afin de maintenir une-z, A-Z et 0-1, mais pas codé repos:

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();
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top