我正在使用C#和.Net 3.5中的桌面客户端程序与Web服务器进行交互.我正在使用Fiddler来查看Web浏览器发送的流量,并模拟它.可悲的是,这台服务器已经很老了,对于charsets和utf-8的概念有点困惑.大多数情况下它使用Latin-1.
当我在包含"特殊"字符的Web浏览器中输入数据时,如"Ωπℵ♣♥♥♉♉♋♌♌♎♏♐♑♓♓",fiddler告诉我它们从浏览器传送到服务器如下: "♈ ♉ ♊ ♋ ♌ ♍ ♎ ♏ ♐ ♑ ♒ ♓ "
但对于我的客户端,HttpUtility.HtmlEncode不会转换这些字符,而是将它们保留为原样.我需要打电话将"♈"转换为♈ 等等?
HtmlEncode的返回值类型是一个字符串,它是Unicode,因此不需要对这些字符进行编码.
如果输出流的编码与这些字符不兼容,那么使用HtmlEncode,如下所示: -
HttpUtility.HtmlEncode(outgoingString, Response.Output);
然后HtmlEncode适当地转义字符.
Rich Strahl刚刚发布了一篇博文,Html和Uri字符串编码,没有System.Web,他也有一些自定义代码,可以编码上面的字符范围.
////// HTML-encodes a string and returns the encoded string. /// /// The text string to encode. ///The HTML-encoded text. 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("<"); break; case '>': sb.Append(">"); break; case '"': sb.Append("""); break; case '&': sb.Append("&"); 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(); }
这看起来非常低效,但我能想到的唯一方法是浏览每个角色:
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(); }