7
votes

Htt-députilité.htmlencode s'échappe trop?

Dans notre projet ASP.NET MVC3, la méthode HTTTPUTILITY.HTMENCODE semble échapper trop de caractères. Nos pages Web sont desservies comme pages UTF-8, mais toujours la méthode échappe à des caractères comme ¼ ou le personnage de yen ¥, même si les caractères TESe font partie du Ensemble UTF-8 .

Alors, lorsque ma vue ASP.NET MVC contient la pièce de code suivante: p> xxx pré>

alors je m'attendrais à ce que je voudrais attendre la Encodeur pour échapper aux tags HTML, mais pas em> l'¼mlaut p> xxx pré>

mais cela me donne la pièce suivante de HTML: P> xxx pré>

Pour la complétude, je mentionne également que la réponse de la réponse dans le Web.config est définie explicite sur UTF-8, de sorte que je m'attendrais à ce que la méthode HTMLenCode respecte ce paramètre. P>

    <globalization requestEncoding="utf-8" responseEncoding="utf-8" />


2 commentaires

Vous êtes correct, htmlencode () est coder la plage U + 0080-u + 00FF, car aucune raison documentée. Cependant, cela ne devrait pas causer de problème particulier; Cela entraînera simplement une sortie marginalement plus grande (et cela pourrait également être comprimé avec GZIP). Y a-t-il un problème particulier dont vous avez besoin pour résoudre en évitant le codage de ces caractères?


Ce n'est pas vraiment un problème, plus une question cosmétique cosmétique . C'est juste pas vraiment nécessaire. Nous avons des personnes semi-techniques édictant le HTML à travers une sorte de CMS et ils étaient tous inquiets pourquoi leur contribution est sortie si mauvaise. :-)


3 Réponses :


2
votes

Oui, j'ai le visage le même problème avec mes pages Web. Si nous voyons le code de HTMLenCode, il y a un point qui traduisit cet ensemble de caractères. Voici le code que ce type de caractères a également traduit.

public static unsafe void HtmlEncode(string value, TextWriter output)
{
    if (value != null)
    {
        if (output == null)
        {
            throw new ArgumentNullException("output");
        }
        int num = IndexOfHtmlEncodingChars(value, 0);
        if (num == -1)
        {
            output.Write(value);
        }
        else
        {
            int num2 = value.Length - num;
            fixed (char* str = ((char*) value))
            {
                char* chPtr = str;
                char* chPtr2 = chPtr;
                while (num-- > 0)
                {
                    output.Write(chPtr2[0]);
                    chPtr2++;
                }
                while (num2-- > 0)
                {
                    char ch = chPtr2[0];
                    if (ch <= '>')
                    {
                        switch (ch)
                        {
                            case '&':
                            {
                                output.Write("&amp;");
                                chPtr2++;
                                continue;
                            }
                            case '\'':
                            {
                                output.Write("&#39;");
                                chPtr2++;
                                continue;
                            }
                            case '"':
                            {
                                output.Write("&quot;");
                                chPtr2++;
                                continue;
                            }
                            case '<':
                            {
                                output.Write("&lt;");
                                chPtr2++;
                                continue;
                            }
                            case '>':
                            {
                                output.Write("&gt;");
                                chPtr2++;
                                continue;
                            }
                        }
                        output.Write(ch);
                        chPtr2++;
                        continue;
                    }
                    // !here is the point!
                    if ((ch >= '\x00a0') && (ch < 'Ä€'))
                    {
                        output.Write("&#");
                        output.Write(ch.ToString(NumberFormatInfo.InvariantInfo));
                        output.Write(';');
                    }
                    else
                    {
                        output.Write(ch);
                    }
                    chPtr2++;
                }
            }
        }
    }
}


0 commentaires

1
votes

Comme l'a suggéré Aristos, nous pourrions utiliser la bibliothèque Antigran de Microsoft. Il contient un Unicodecharacterencoder qui se comporte comme vous l'attendez.

mais parce que nous p>

  • ne voulait pas vraiment dépendre d'une bibliothèque tierce pour le codage HTML LI>
  • étaient tout à fait sûrs que notre contenu ne dépassait pas la gamme UTF-8. LI> ul>

    Nous avons choisi de mettre en œuvre notre propre codeur HTML très basique em>. Vous pouvez trouver le code ci-dessous. N'hésitez pas à vous adapter / commenter / améliorer si vous voyez des problèmes. P>

    public static class HtmlEncoder
    {
        private static IDictionary<char, string> toEscape = new Dictionary<char, string>()
                                                                {
                                                                    { '<', "lt" },
                                                                    { '>', "gt" },
                                                                    { '"', "quot" },
                                                                    { '&', "amp" },
                                                                    { '\'', "#39" },
                                                                };
        /// <summary>
        /// HTML-Encodes the provided value
        /// </summary>
        /// <param name="value">object to encode</param>
        /// <returns>An HTML-encoded string representing the provided value.</returns>
        public static string Encode(object value)
        {
            if (value == null)
                return string.Empty;
    
            // If value is bare HTML, we expect it to be encoded already
            if (value is IHtmlString)
                return value.ToString();
    
            string toEncode = value.ToString();
    
            // Init capacity to length of string to encode
            var builder = new StringBuilder(toEncode.Length);
    
            foreach (char c in toEncode)
            {
                string result;
                bool success = toEscape.TryGetValue(c, out result);
    
                string character = success
                                    ? "&" + result + ";"
                                    : c.ToString();
    
                builder.Append(character);
            }
    
            return builder.ToString();
        }
    }
    


0 commentaires

0
votes

Basé sur la réponse de Thomas, une amélioration du bit pour l'espace, l'onglet et la nouvelle gestion de ligne, car elles pourraient casser la structure de HTML:

public static string HtmlEncode(string value,bool removeNewLineAndTabs)
    {
        if (value == null)
            return string.Empty;

        string toEncode = value.ToString();

        // Init capacity to length of string to encode
        var builder = new StringBuilder(toEncode.Length);

        foreach (char c in toEncode)
        {
            string result;
            bool success = toEscape.TryGetValue(c, out result);

            string character = success ? result : c.ToString();

            builder.Append(character);
        }

        string retVal = builder.ToString();

        if (removeNewLineAndTabs)
        {
            retVal = retVal.Replace("\r\n", " ");
            retVal = retVal.Replace("\r", " ");
            retVal = retVal.Replace("\n", " ");
            retVal = retVal.Replace("\t", " ");
        }
        return retVal;
    }


0 commentaires