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. :-)