没有System.Web的HTML解码

Wjd*_*is5 5 .net c# sql-server clr

我正在为SQL Server 2008 R2开发CLR表值函数.我需要在一个点上对一个字符串进行HTMLDecode,但这是有问题的b/c依赖于System.Web,而System.Web不是SQL Server的支持程序集.

有谁能想到更好的方法来进行HTML解码?

仅供参考 SQL Server 2008 CLR仅支持.NET 3.5,因此system.net.webutility不起作用.

Ond*_*dar 1

您还可以使用反射器直接从 WebUtility 获取代码(请不要因为编码风格及其反射的内容而责怪我):

\n\n
public class WebUtility {\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  private static class HtmlEntities {\n  private static string[] _entitiesList = new string[]\n        {\n            "\\"-quot",\n            "&-amp",\n            "\'-apos",\n            "<-lt",\n            ">-gt",\n            "\\u00a0-nbsp",\n            "\xc2\xa1-iexcl",\n            "\xc2\xa2-cent",\n            "\xc2\xa3-pound",\n            "\xc2\xa4-curren",\n            "\xc2\xa5-yen",\n            "\xc2\xa6-brvbar",\n            "\xc2\xa7-sect",\n            "\xc2\xa8-uml",\n            "\xc2\xa9-copy",\n            "\xc2\xaa-ordf",\n            "\xc2\xab-laquo",\n            "\xc2\xac-not",\n            "\xc2\xad-shy",\n            "\xc2\xae-reg",\n            "\xc2\xaf-macr",\n            "\xc2\xb0-deg",\n            "\xc2\xb1-plusmn",\n            "\xc2\xb2-sup2",\n            "\xc2\xb3-sup3",\n            "\xc2\xb4-acute",\n            "\xc2\xb5-micro",\n            "\xc2\xb6-para",\n            "\xc2\xb7-middot",\n            "\xc2\xb8-cedil",\n            "\xc2\xb9-sup1",\n            "\xc2\xba-ordm",\n            "\xc2\xbb-raquo",\n            "\xc2\xbc-frac14",\n            "\xc2\xbd-frac12",\n            "\xc2\xbe-frac34",\n            "\xc2\xbf-iquest",\n            "\xc3\x80-Agrave",\n            "\xc3\x81-Aacute",\n            "\xc3\x82-Acirc",\n            "\xc3\x83-Atilde",\n            "\xc3\x84-Auml",\n            "\xc3\x85-Aring",\n            "\xc3\x86-AElig",\n            "\xc3\x87-Ccedil",\n            "\xc3\x88-Egrave",\n            "\xc3\x89-Eacute",\n            "\xc3\x8a-Ecirc",\n            "\xc3\x8b-Euml",\n            "\xc3\x8c-Igrave",\n            "\xc3\x8d-Iacute",\n            "\xc3\x8e-Icirc",\n            "\xc3\x8f-Iuml",\n            "\xc3\x90-ETH",\n            "\xc3\x91-Ntilde",\n            "\xc3\x92-Ograve",\n            "\xc3\x93-Oacute",\n            "\xc3\x94-Ocirc",\n            "\xc3\x95-Otilde",\n            "\xc3\x96-Ouml",\n            "\xc3\x97-times",\n            "\xc3\x98-Oslash",\n            "\xc3\x99-Ugrave",\n            "\xc3\x9a-Uacute",\n            "\xc3\x9b-Ucirc",\n            "\xc3\x9c-Uuml",\n            "\xc3\x9d-Yacute",\n            "\xc3\x9e-THORN",\n            "\xc3\x9f-szlig",\n            "\xc3\xa0-agrave",\n            "\xc3\xa1-aacute",\n            "\xc3\xa2-acirc",\n            "\xc3\xa3-atilde",\n            "\xc3\xa4-auml",\n            "\xc3\xa5-aring",\n            "\xc3\xa6-aelig",\n            "\xc3\xa7-ccedil",\n            "\xc3\xa8-egrave",\n            "\xc3\xa9-eacute",\n            "\xc3\xaa-ecirc",\n            "\xc3\xab-euml",\n            "\xc3\xac-igrave",\n            "\xc3\xad-iacute",\n            "\xc3\xae-icirc",\n            "\xc3\xaf-iuml",\n            "\xc3\xb0-eth",\n            "\xc3\xb1-ntilde",\n            "\xc3\xb2-ograve",\n            "\xc3\xb3-oacute",\n            "\xc3\xb4-ocirc",\n            "\xc3\xb5-otilde",\n            "\xc3\xb6-ouml",\n            "\xc3\xb7-divide",\n            "\xc3\xb8-oslash",\n            "\xc3\xb9-ugrave",\n            "\xc3\xba-uacute",\n            "\xc3\xbb-ucirc",\n            "\xc3\xbc-uuml",\n            "\xc3\xbd-yacute",\n            "\xc3\xbe-thorn",\n            "\xc3\xbf-yuml",\n            "\xc5\x92-OElig",\n            "\xc5\x93-oelig",\n            "\xc5\xa0-Scaron",\n            "\xc5\xa1-scaron",\n            "\xc5\xb8-Yuml",\n            "\xc6\x92-fnof",\n            "\xcb\x86-circ",\n            "\xcb\x9c-tilde",\n            "\xce\x91-Alpha",\n            "\xce\x92-Beta",\n            "\xce\x93-Gamma",\n            "\xce\x94-Delta",\n            "\xce\x95-Epsilon",\n            "\xce\x96-Zeta",\n            "\xce\x97-Eta",\n            "\xce\x98-Theta",\n            "\xce\x99-Iota",\n            "\xce\x9a-Kappa",\n            "\xce\x9b-Lambda",\n            "\xce\x9c-Mu",\n            "\xce\x9d-Nu",\n            "\xce\x9e-Xi",\n            "\xce\x9f-Omicron",\n            "\xce\xa0-Pi",\n            "\xce\xa1-Rho",\n            "\xce\xa3-Sigma",\n            "\xce\xa4-Tau",\n            "\xce\xa5-Upsilon",\n            "\xce\xa6-Phi",\n            "\xce\xa7-Chi",\n            "\xce\xa8-Psi",\n            "\xce\xa9-Omega",\n            "\xce\xb1-alpha",\n            "\xce\xb2-beta",\n            "\xce\xb3-gamma",\n            "\xce\xb4-delta",\n            "\xce\xb5-epsilon",\n            "\xce\xb6-zeta",\n            "\xce\xb7-eta",\n            "\xce\xb8-theta",\n            "\xce\xb9-iota",\n            "\xce\xba-kappa",\n            "\xce\xbb-lambda",\n            "\xce\xbc-mu",\n            "\xce\xbd-nu",\n            "\xce\xbe-xi",\n            "\xce\xbf-omicron",\n            "\xcf\x80-pi",\n            "\xcf\x81-rho",\n            "\xcf\x82-sigmaf",\n            "\xcf\x83-sigma",\n            "\xcf\x84-tau",\n            "\xcf\x85-upsilon",\n            "\xcf\x86-phi",\n            "\xcf\x87-chi",\n            "\xcf\x88-psi",\n            "\xcf\x89-omega",\n            "\xcf\x91-thetasym",\n            "\xcf\x92-upsih",\n            "\xcf\x96-piv",\n            "\\u2002-ensp",\n            "\\u2003-emsp",\n            "\\u2009-thinsp",\n            "\xe2\x80\x8c-zwnj",\n            "\xe2\x80\x8d-zwj",\n            "\xe2\x80\x8e-lrm",\n            "\xe2\x80\x8f-rlm",\n            "\xe2\x80\x93-ndash",\n            "\xe2\x80\x94-mdash",\n            "\xe2\x80\x98-lsquo",\n            "\xe2\x80\x99-rsquo",\n            "\xe2\x80\x9a-sbquo",\n            "\xe2\x80\x9c-ldquo",\n            "\xe2\x80\x9d-rdquo",\n            "\xe2\x80\x9e-bdquo",\n            "\xe2\x80\xa0-dagger",\n            "\xe2\x80\xa1-Dagger",\n            "\xe2\x80\xa2-bull",\n            "\xe2\x80\xa6-hellip",\n            "\xe2\x80\xb0-permil",\n            "\xe2\x80\xb2-prime",\n            "\xe2\x80\xb3-Prime",\n            "\xe2\x80\xb9-lsaquo",\n            "\xe2\x80\xba-rsaquo",\n            "\xe2\x80\xbe-oline",\n            "\xe2\x81\x84-frasl",\n            "\xe2\x82\xac-euro",\n            "\xe2\x84\x91-image",\n            "\xe2\x84\x98-weierp",\n            "\xe2\x84\x9c-real",\n            "\xe2\x84\xa2-trade",\n            "\xe2\x84\xb5-alefsym",\n            "\xe2\x86\x90-larr",\n            "\xe2\x86\x91-uarr",\n            "\xe2\x86\x92-rarr",\n            "\xe2\x86\x93-darr",\n            "\xe2\x86\x94-harr",\n            "\xe2\x86\xb5-crarr",\n            "\xe2\x87\x90-lArr",\n            "\xe2\x87\x91-uArr",\n            "\xe2\x87\x92-rArr",\n            "\xe2\x87\x93-dArr",\n            "\xe2\x87\x94-hArr",\n            "\xe2\x88\x80-forall",\n            "\xe2\x88\x82-part",\n            "\xe2\x88\x83-exist",\n            "\xe2\x88\x85-empty",\n            "\xe2\x88\x87-nabla",\n            "\xe2\x88\x88-isin",\n            "\xe2\x88\x89-notin",\n            "\xe2\x88\x8b-ni",\n            "\xe2\x88\x8f-prod",\n            "\xe2\x88\x91-sum",\n            "\xe2\x88\x92-minus",\n            "\xe2\x88\x97-lowast",\n            "\xe2\x88\x9a-radic",\n            "\xe2\x88\x9d-prop",\n            "\xe2\x88\x9e-infin",\n            "\xe2\x88\xa0-ang",\n            "\xe2\x88\xa7-and",\n            "\xe2\x88\xa8-or",\n            "\xe2\x88\xa9-cap",\n            "\xe2\x88\xaa-cup",\n            "\xe2\x88\xab-int",\n            "\xe2\x88\xb4-there4",\n            "\xe2\x88\xbc-sim",\n            "\xe2\x89\x85-cong",\n            "\xe2\x89\x88-asymp",\n            "\xe2\x89\xa0-ne",\n            "\xe2\x89\xa1-equiv",\n            "\xe2\x89\xa4-le",\n            "\xe2\x89\xa5-ge",\n            "\xe2\x8a\x82-sub",\n            "\xe2\x8a\x83-sup",\n            "\xe2\x8a\x84-nsub",\n            "\xe2\x8a\x86-sube",\n            "\xe2\x8a\x87-supe",\n            "\xe2\x8a\x95-oplus",\n            "\xe2\x8a\x97-otimes",\n            "\xe2\x8a\xa5-perp",\n            "\xe2\x8b\x85-sdot",\n            "\xe2\x8c\x88-lceil",\n            "\xe2\x8c\x89-rceil",\n            "\xe2\x8c\x8a-lfloor",\n            "\xe2\x8c\x8b-rfloor",\n            "\xe2\x8c\xa9-lang",\n            "\xe2\x8c\xaa-rang",\n            "\xe2\x97\x8a-loz",\n            "\xe2\x99\xa0-spades",\n            "\xe2\x99\xa3-clubs",\n            "\xe2\x99\xa5-hearts",\n            "\xe2\x99\xa6-diams"\n        };\n  private static Dictionary<string, char> _lookupTable = WebUtility.HtmlEntities.GenerateLookupTable();\n  private static Dictionary<string, char> GenerateLookupTable() {\n    Dictionary<string, char> dictionary = new Dictionary<string, char>(StringComparer.Ordinal);\n    string[] entitiesList = WebUtility.HtmlEntities._entitiesList;\n    for (int i = 0; i < entitiesList.Length; i++) {\n      string text = entitiesList[i];\n      dictionary.Add(text.Substring(2), text[0]);\n    }\n    return dictionary;\n  }\n  public static char Lookup(string entity) {\n    char result;\n    WebUtility.HtmlEntities._lookupTable.TryGetValue(entity, out result);\n    return result;\n  }\n}\n  private enum UnicodeDecodingConformance {\n    Auto,\n    Strict,\n    Compat,\n    Loose\n  }\n\n  private static char[] _htmlEntityEndingChars = new char[] { \';\', \'&\' };\n  private static readonly UnicodeDecodingConformance _htmlDecodeConformance = UnicodeDecodingConformance.Auto;\n\n  public static string HtmlDecode(string value) {\n    if (string.IsNullOrEmpty(value)) {\n      return value;\n    }\n    if (!WebUtility.StringRequiresHtmlDecoding(value)) {\n      return value;\n    }\n    StringWriter stringWriter = new StringWriter(CultureInfo.InvariantCulture);\n    WebUtility.HtmlDecode(value, stringWriter);\n    return stringWriter.ToString();\n  }\n\n  private static bool StringRequiresHtmlDecoding(string s) {\n    if (WebUtility._htmlDecodeConformance == UnicodeDecodingConformance.Compat) {\n      return s.IndexOf(\'&\') >= 0;\n    }\n    for (int i = 0; i < s.Length; i++) {\n      char c = s[i];\n      if (c == \'&\' || char.IsSurrogate(c)) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  private static void ConvertSmpToUtf16(uint smpChar, out char leadingSurrogate, out char trailingSurrogate) {\n    int num = (int)(smpChar - 65536u);\n    leadingSurrogate = (char)(num / 1024 + 55296);\n    trailingSurrogate = (char)(num % 1024 + 56320);\n  }\n\n  public static void HtmlDecode(string value, TextWriter output) {\n    if (value == null) {\n      return;\n    }\n    if (output == null) {\n      throw new ArgumentNullException("output");\n    }\n    if (!WebUtility.StringRequiresHtmlDecoding(value)) {\n      output.Write(value);\n      return;\n    }\n    int length = value.Length;\n    int i = 0;\n    while (i < length) {\n      char c = value[i];\n      if (c != \'&\') {\n        goto IL_1B6;\n      }\n      int num = value.IndexOfAny(WebUtility._htmlEntityEndingChars, i + 1);\n      if (num <= 0 || value[num] != \';\') {\n        goto IL_1B6;\n      }\n      string text = value.Substring(i + 1, num - i - 1);\n      if (text.Length > 1 && text[0] == \'#\') {\n        uint num2;\n        bool flag;\n        if (text[1] == \'x\' || text[1] == \'X\') {\n          flag = uint.TryParse(text.Substring(2), NumberStyles.AllowHexSpecifier, NumberFormatInfo.InvariantInfo, out num2);\n        } else {\n          flag = uint.TryParse(text.Substring(1), NumberStyles.Integer, NumberFormatInfo.InvariantInfo, out num2);\n        }\n        if (flag) {\n          switch (WebUtility._htmlDecodeConformance) {\n            case UnicodeDecodingConformance.Strict:\n              flag = (num2 < 55296u || (57343u < num2 && num2 <= 1114111u));\n              break;\n            case UnicodeDecodingConformance.Compat:\n              flag = (0u < num2 && num2 <= 65535u);\n              break;\n            case UnicodeDecodingConformance.Loose:\n              flag = (num2 <= 1114111u);\n              break;\n            default:\n              flag = false;\n              break;\n          }\n        }\n        if (!flag) {\n          goto IL_1B6;\n        }\n        if (num2 <= 65535u) {\n          output.Write((char)num2);\n        } else {\n          char value2;\n          char value3;\n          WebUtility.ConvertSmpToUtf16(num2, out value2, out value3);\n          output.Write(value2);\n          output.Write(value3);\n        }\n        i = num;\n      } else {\n        i = num;\n        char c2 = WebUtility.HtmlEntities.Lookup(text);\n        if (c2 != \'\\0\') {\n          c = c2;\n          goto IL_1B6;\n        }\n        output.Write(\'&\');\n        output.Write(text);\n        output.Write(\';\');\n      }\n    IL_1BD:\n      i++;\n      continue;\n    IL_1B6:\n      output.Write(c);\n      goto IL_1BD;\n    }\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n