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不起作用.
您还可以使用反射器直接从 WebUtility 获取代码(请不要因为编码风格及其反射的内容而责怪我):
\n\npublic 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}\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
989 次 |
| 最近记录: |