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> alors je m'attendrais à ce que je voudrais attendre la Encodeur pour échapper aux tags HTML, mais pas em> l'¼mlaut p> 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" />
3 Réponses :
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("&"); chPtr2++; continue; } case '\'': { output.Write("'"); chPtr2++; continue; } case '"': { output.Write("""); chPtr2++; continue; } case '<': { output.Write("<"); chPtr2++; continue; } case '>': { output.Write(">"); 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++; } } } } }
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>
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();
}
}
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; }
Vous êtes correct,
htmlencode () code> 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 i>. 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. :-)