HttpUtility.HtmlEncode不编码所有内容

Ant*_*ony 17 html c# encoding utf-8

我正在使用C#和.Net 3.5中的桌面客户端程序与Web服务器进行交互.我正在使用Fiddler来查看Web浏览器发送的流量,并模拟它.可悲的是,这台服务器已经很老了,对于charsets和utf-8的概念有点困惑.大多数情况下它使用Latin-1.

当我在包含"特殊"字符的Web浏览器中输入数据时,如"Ωπℵ♣♥♥♉♉♋♌♌♎♏♐♑♓♓",fiddler告诉我它们从浏览器传送到服务器如下: "♈ ♉ ♊ ♋ ♌ ♍ ♎ ♏ ♐ ♑ ♒ ♓ "

但对于我的客户端,HttpUtility.HtmlEncode不会转换这些字符,而是将它们保留为原样.我需要打电话将"♈"转换为♈ 等等?

Ant*_*nes 13

HtmlEncode的返回值类型是一个字符串,它是Unicode,因此不需要对这些字符进行编码.

如果输出流的编码与这些字符不兼容,那么使用HtmlEncode,如下所示: -

 HttpUtility.HtmlEncode(outgoingString, Response.Output);
Run Code Online (Sandbox Code Playgroud)

然后HtmlEncode适当地转义字符.


bdu*_*kes 12

Rich Strahl刚刚发布了一篇博文,Html和Uri字符串编码,没有System.Web,他也有一些自定义代码,可以编码上面的字符范围.

/// <summary>
/// HTML-encodes a string and returns the encoded string.
/// </summary>
/// <param name="text">The text string to encode. </param>
/// <returns>The HTML-encoded text.</returns>
public static string HtmlEncode(string text)
{
    if (text == null)
        return null;

    StringBuilder sb = new StringBuilder(text.Length);

    int len = text.Length;
    for (int i = 0; i < len; i++)
    {
        switch (text[i])
        {

            case '<':
                sb.Append("&lt;");
                break;
            case '>':
                sb.Append("&gt;");
                break;
            case '"':
                sb.Append("&quot;");
                break;
            case '&':
                sb.Append("&amp;");
                break;
            default:
                if (text[i] > 159)
                {
                    // decimal numeric entity
                    sb.Append("&#");
                    sb.Append(((int)text[i]).ToString(CultureInfo.InvariantCulture));
                    sb.Append(";");
                }
                else
                    sb.Append(text[i]);
                break;
        }
    }
    return sb.ToString();
}
Run Code Online (Sandbox Code Playgroud)

  • 为什么159为截止? (5认同)

Ric*_*ick 12

这看起来非常低效,但我能想到的唯一方法是浏览每个角色:

public static string MyHtmlEncode(string value)
{
   // call the normal HtmlEncode first
   char[] chars = HttpUtility.HtmlEncode(value).ToCharArray();
   StringBuilder encodedValue = new StringBuilder();
   foreach(char c in chars)
   {
      if ((int)c > 127) // above normal ASCII
         encodedValue.Append("&#" + (int)c + ";");
      else
         encodedValue.Append(c);
   }
   return encodedValue.ToString();
}
Run Code Online (Sandbox Code Playgroud)