本文介绍了WebUtility.HtmlDecode VS HttpUtilty.HtmlDecode的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述 我用 WebUtilty.HtmlDecode 解码HTML。事实证明,它不正确解码,例如,&放大器;#8211; 应该解码为 - 字符,但 WebUtilty.HtmlDecode 不解码。 HttpUtilty.HtmlDecode ,但是,确实。I was using WebUtilty.HtmlDecode to decode HTML. It turns out that it doesn't decode properly, for example, &#8211; is supposed to decode to a "–" character, but WebUtilty.HtmlDecode does not decode it. HttpUtilty.HtmlDecode, however, does.Debug.WriteLine(WebUtility.HtmlDecode("&#8211;"));Debug.WriteLine(HttpUtility.HtmlDecode("&#8211;"));> &#8211;> – ​​ 有关这两个文档是相同的:的已经HTML编码的字符串转换HTTP传送到一个​​解码的字符串。的The documentation for both of these is the same:Converts a string that has been HTML-encoded for HTTP transmission into a decoded string.为什么他们不同,哪一个我应该使用的,如果我切换到WebUtility.HtmlDecode什么会改变得到 - ?正确解码Why are they different, which one should I be using, and what will change if I switch to WebUtility.HtmlDecode to get "–" to decode correctly?推荐答案这两种方法的实施确实对Windows Phone的不同The implementation of the two methods are indeed different on Windows Phone. WebUtility.HtmlDecode: public static void HtmlDecode(string value, TextWriter output){ if (value != null) { if (output == null) { throw new ArgumentNullException("output"); } if (!StringRequiresHtmlDecoding(value)) { output.Write(value); } else { int length = value.Length; for (int i = 0; i < length; i++) { bool flag; uint num4; char ch = value[i]; if (ch != '&') { goto Label_01B6; } int num3 = value.IndexOfAny(_htmlEntityEndingChars, i + 1); if ((num3 <= 0) || (value[num3] != ';')) { goto Label_01B6; } string entity = value.Substring(i + 1, (num3 - i) - 1); if ((entity.Length <= 1) || (entity[0] != '#')) { goto Label_0188; } if ((entity[1] == 'x') || (entity[1] == 'X')) { flag = uint.TryParse(entity.Substring(2), NumberStyles.AllowHexSpecifier, NumberFormatInfo.InvariantInfo, out num4); } else { flag = uint.TryParse(entity.Substring(1), NumberStyles.Integer, NumberFormatInfo.InvariantInfo, out num4); } if (flag) { switch (_htmlDecodeConformance) { case UnicodeDecodingConformance.Strict: flag = (num4 < 0xd800) || ((0xdfff < num4) && (num4 <= 0x10ffff)); goto Label_0151; case UnicodeDecodingConformance.Compat: flag = (0 < num4) && (num4 <= 0xffff); goto Label_0151; case UnicodeDecodingConformance.Loose: flag = num4 <= 0x10ffff; goto Label_0151; } flag = false; } Label_0151: if (!flag) { goto Label_01B6; } if (num4 <= 0xffff) { output.Write((char) num4); } else { char ch2; char ch3; ConvertSmpToUtf16(num4, out ch2, out ch3); output.Write(ch2); output.Write(ch3); } i = num3; goto Label_01BD; Label_0188: i = num3; char ch4 = HtmlEntities.Lookup(entity); if (ch4 != '\0') { ch = ch4; } else { output.Write('&'); output.Write(entity); output.Write(';'); goto Label_01BD; } Label_01B6: output.Write(ch); Label_01BD:; } } }} HttpUtility.HtmlDecode: public static string HtmlDecode(string html){ if (html == null) { return null; } if (html.IndexOf('&') < 0) { return html; } StringBuilder sb = new StringBuilder(); StringWriter writer = new StringWriter(sb, CultureInfo.InvariantCulture); int length = html.Length; for (int i = 0; i < length; i++) { char ch = html[i]; if (ch == '&') { int num3 = html.IndexOfAny(s_entityEndingChars, i + 1); if ((num3 > 0) && (html[num3] == ';')) { string entity = html.Substring(i + 1, (num3 - i) - 1); if ((entity.Length > 1) && (entity[0] == '#')) { try { if ((entity[1] == 'x') || (entity[1] == 'X')) { ch = (char) int.Parse(entity.Substring(2), NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture); } else { ch = (char) int.Parse(entity.Substring(1), CultureInfo.InvariantCulture); } i = num3; } catch (FormatException) { i++; } catch (ArgumentException) { i++; } } else { i = num3; char ch2 = HtmlEntities.Lookup(entity); if (ch2 != '\0') { ch = ch2; } else { writer.Write('&'); writer.Write(entity); writer.Write(';'); continue; } } } } writer.Write(ch); } return sb.ToString();} 有趣的是,WebUtility上不存在WP7。另外,WebUtility的WP8实施是相同的桌面之一。 HttpUtility.HtmlDecode 的桌面实施只是围绕 WebUtility.HtmlDecode 的包装。最后但并非最不重要的Silverlight 5有相同的实施 HttpUtility.HtmlDecode 为Windows Phone和没有实现WebUtility。Interestingly, WebUtility doesn't exist on WP7. Also, the WP8 implementation of WebUtility is identical to the desktop one. The desktop implementation of HttpUtility.HtmlDecode is just a wrapper around WebUtility.HtmlDecode. Last but not least, Silverlight 5 has the same implementation of HttpUtility.HtmlDecode as Windows Phone, and does not implement WebUtility.从那里,我可以大胆猜测:因为Windows Phone 7的运行是基于Silverlight的,WP7继承的 HttpUtility.HtmlDecode Silverlight的版本,WebUtility WASN T存在。然后来到WP8,它的运行是基于WinRT的。 WinRT的带来WebUtility,和老版 HttpUtility.HtmlDecode 的保持,以确保与传统应用WP7的相容性。From there, I can venture a guess: since the Windows Phone 7 runtime is based on Silverlight, WP7 inherited of the Silverlight version of HttpUtility.HtmlDecode, and WebUtility wasn't present. Then came WP8, whose runtime is based on WinRT. WinRT brought WebUtility, and the old version of HttpUtility.HtmlDecode was kept to ensure the compatibility with the legacy WP7 apps.由于知道你应该使用哪一个?如果你想针对WP7,那么你没有选择,只能使用 HttpUtility.HtmlDecode 。如果你的目标WP8,然后随便挑,其行为符合您需求的最佳方法。 WebUtility可能是面向未来的选择,以防万一微软决定抛弃Silverlight运行中的Windows Phone即将到来的版本。但我只是捡HttpUtility的现实选择去不必担心手工,支持你把你的问题的例子。As to know which one you should use... If you want to target WP7 then you have no choice but to use HttpUtility.HtmlDecode. If you're targeting WP8, then just pick the method whose behavior suits your needs the best. WebUtility is probably the future-proof choice, just in case Microsoft decides to ditch the Silverlight runtime in an upcoming version of Windows Phone. But I'd just go with the practical choice of picking HttpUtility to not have to worry about manually supporting the example you've put in your question. 这篇关于WebUtility.HtmlDecode VS HttpUtilty.HtmlDecode的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!
10-27 12:28