WebUtility.HtmlDecode vs HttpUtilty.HtmlDecode
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();
}
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.
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.
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.
Any difference in using HttpUtility.HtmlEncode() and Server.HtmlEncode()?
Look at this
StackOverflow
and may be this can help too
codeproject
Hope this help!
Differences between different .net framework HtmlEncode methods
If you dig though the source code you can follow easily enough.
System.Web.HttpUtility.HtmlEncode
/// <devdoc>
/// <para>
/// HTML encodes a string and returns the encoded string.
/// </para>
/// </devdoc>
public static String HtmlEncode(String s) {
return HttpEncoder.Current.HtmlEncode(s);
}
System.Web.HttpServerUtility.HtmlEncode
/// <devdoc>
/// <para>
/// HTML
/// encodes a given string and
/// returns the encoded string.
/// </para>
/// </devdoc>
public string HtmlEncode(string s) {
return HttpUtility.HtmlEncode(s);
}
System.Net.WebUtility.HtmlEncode
public static string HtmlEncode(string value) {
if (String.IsNullOrEmpty(value)) {
return value;
}
// Don't create string writer if we don't have nothing to encode
int index = IndexOfHtmlEncodingChars(value, 0);
if (index == -1) {
return value;
}
StringWriter writer = new StringWriter(CultureInfo.InvariantCulture);
HtmlEncode(value, writer);
return writer.ToString();
}
So System.Web.HttpServerUtility.HtmlEncode
actually uses System.Web.HttpUtility.HtmlEncode
. If you drill into HttpEncoder.Current.HtmlEncode(s);
this has the following code:
protected internal virtual void HtmlDecode(string value, TextWriter output) {
WebUtility.HtmlDecode(value, output);
}
Tl;Dr
So they all, ultimately, use System.Net.WebUtility.HtmlEncode
. I guess the System.Web
version are only there for backwards compatibillity. Hence the advice of using the System.Net
version.
What is the difference between HttpUtility.HtmlEncode and Server.HtmlEncode
Have a look at Server.HtmlEncode vs HttpUtility.HtmlEncode .
Basically, Server.HtmlEncode
uses a specific instance of the System.Web.HttpServerUtility
class that's inherited from the Page
class. HttpUtility.HtmlEncode
is a static method, so you don't have to instantiate the HttpUtility
class.
All else being equal, go with the static HttpUtility.HtmlEncode
.
Decoding string using HtmlDecode or Escape
You can use HtmlEncode
to encode the string and then you can use HtmlDecode
to return the original value:
string x = "éí&";
string encoded = System.Web.HttpUtility.HtmlEncode(x);
Console.WriteLine(encoded); //éí&
string decoded = System.Web.HttpUtility.HtmlDecode(encoded);
Console.WriteLine(decoded); //éí&
With your update, you just need to decode the string:
String decoded = System.Web.HttpUtility.HtmlDecode("November is Fruit's Fresh.");
Console.WriteLine(decoded); //November is Fruit's Fresh.
How can I decode HTML characters in C#?
You can use HttpUtility.HtmlDecode
If you are using .NET 4.0+ you can also use WebUtility.HtmlDecode
which does not require an extra assembly reference as it is available in the System.Net
namespace.
Asp.net Core 2.1 MVC Decode in a View
@{
var span = "<span class='card-text h5 text-danger'>Hot Sandwiches</span>";
}
To display as string, use @span
, result:
<span class='card-text h5 text-danger'>Hot Sandwiches</span>
or @Html.Raw(span)
, result:
Hot Sandwiches
Related Topics
Add the Where Clause Dynamically in Entity Framework
How to Check If a Given Value Is a Generic List
Using a Wwwroot Folder (ASP.NET Core Style) in ASP.NET 4.5 Project
C#: Throwing Custom Exception Best Practices
How to Ask The Socket to Wait for More Data to Come
Use or Clause in Queryover in Nhibernate
Find Element in Selenium Using Xpath or CSS Selector
How to Add a Custom View Dynamically to a View in Visual Studio for MAC C#
How to Change The Colour of The Line Below/Border of a Textbox (Entry)
How to Target Mono Framework from Vs2015
Use Decimal Values as Attribute Params in C#
Retrieve an Object from Entityframework Without One Field
Calling a SQL User-Defined Function in a Linq Query
Xamarin Android Alarm Manager Issue
How to Share an Enum Declaration Between C# and Unmanaged C++