views:

622

answers:

4

A project using .NET Compact Framework does not allow use System.Web library.

How can I do to HTMLDecode a string using .NET Compact Framework?

I didn't found any class that do that.

A: 

You could always port the code from Mono, sample VB code or sample Java code found with a simple web search.

ctacke
A: 

If you decompile the .NET Framework source you can get the methods you need. I did it for you, so you can copy and paste the two classes below:

internal class HtmlEntities
{
    // Fields
    private static string[] _entitiesList = new string[] { 
            "\"-quot", "&-amp", "<-lt", ">-gt", "\x00a0-nbsp", "\x00a1-iexcl", "\x00a2-cent", "\x00a3-pound", "\x00a4-curren", "\x00a5-yen", "\x00a6-brvbar", "\x00a7-sect", "\x00a8-uml", "\x00a9-copy", "\x00aa-ordf", "\x00ab-laquo", 
            "\x00ac-not", "\x00ad-shy", "\x00ae-reg", "\x00af-macr", "\x00b0-deg", "\x00b1-plusmn", "\x00b2-sup2", "\x00b3-sup3", "\x00b4-acute", "\x00b5-micro", "\x00b6-para", "\x00b7-middot", "\x00b8-cedil", "\x00b9-sup1", "\x00ba-ordm", "\x00bb-raquo", 
            "\x00bc-frac14", "\x00bd-frac12", "\x00be-frac34", "\x00bf-iquest", "\x00c0-Agrave", "\x00c1-Aacute", "\x00c2-Acirc", "\x00c3-Atilde", "\x00c4-Auml", "\x00c5-Aring", "\x00c6-AElig", "\x00c7-Ccedil", "\x00c8-Egrave", "\x00c9-Eacute", "\x00ca-Ecirc", "\x00cb-Euml", 
            "\x00cc-Igrave", "\x00cd-Iacute", "\x00ce-Icirc", "\x00cf-Iuml", "\x00d0-ETH", "\x00d1-Ntilde", "\x00d2-Ograve", "\x00d3-Oacute", "\x00d4-Ocirc", "\x00d5-Otilde", "\x00d6-Ouml", "\x00d7-times", "\x00d8-Oslash", "\x00d9-Ugrave", "\x00da-Uacute", "\x00db-Ucirc", 
            "\x00dc-Uuml", "\x00dd-Yacute", "\x00de-THORN", "\x00df-szlig", "\x00e0-agrave", "\x00e1-aacute", "\x00e2-acirc", "\x00e3-atilde", "\x00e4-auml", "\x00e5-aring", "\x00e6-aelig", "\x00e7-ccedil", "\x00e8-egrave", "\x00e9-eacute", "\x00ea-ecirc", "\x00eb-euml", 
            "\x00ec-igrave", "\x00ed-iacute", "\x00ee-icirc", "\x00ef-iuml", "\x00f0-eth", "\x00f1-ntilde", "\x00f2-ograve", "\x00f3-oacute", "\x00f4-ocirc", "\x00f5-otilde", "\x00f6-ouml", "\x00f7-divide", "\x00f8-oslash", "\x00f9-ugrave", "\x00fa-uacute", "\x00fb-ucirc", 
            "\x00fc-uuml", "\x00fd-yacute", "\x00fe-thorn", "\x00ff-yuml", "Œ-OElig", "œ-oelig", "Š-Scaron", "š-scaron", "Ÿ-Yuml", "ƒ-fnof", "ˆ-circ", "˜-tilde", "Α-Alpha", "Β-Beta", "Γ-Gamma", "Δ-Delta", 
            "Ε-Epsilon", "Ζ-Zeta", "Η-Eta", "Θ-Theta", "Ι-Iota", "Κ-Kappa", "Λ-Lambda", "Μ-Mu", "Ν-Nu", "Ξ-Xi", "Ο-Omicron", "Π-Pi", "Ρ-Rho", "Σ-Sigma", "Τ-Tau", "Υ-Upsilon", 
            "Φ-Phi", "Χ-Chi", "Ψ-Psi", "Ω-Omega", "α-alpha", "β-beta", "γ-gamma", "δ-delta", "ε-epsilon", "ζ-zeta", "η-eta", "θ-theta", "ι-iota", "κ-kappa", "λ-lambda", "μ-mu", 
            "ν-nu", "ξ-xi", "ο-omicron", "π-pi", "ρ-rho", "ς-sigmaf", "σ-sigma", "τ-tau", "υ-upsilon", "φ-phi", "χ-chi", "ψ-psi", "ω-omega", "ϑ-thetasym", "ϒ-upsih", "ϖ-piv", 
            " -ensp", " -emsp", " -thinsp", "‌-zwnj", "‍-zwj", "‎-lrm", "‏-rlm", "–-ndash", "—-mdash", "‘-lsquo", "’-rsquo", "‚-sbquo", "“-ldquo", "”-rdquo", "„-bdquo", "†-dagger", 
            "‡-Dagger", "•-bull", "…-hellip", "‰-permil", "′-prime", "″-Prime", "‹-lsaquo", "›-rsaquo", "‾-oline", "⁄-frasl", "€-euro", "ℑ-image", "℘-weierp", "ℜ-real", "™-trade", "ℵ-alefsym", 
            "←-larr", "↑-uarr", "→-rarr", "↓-darr", "↔-harr", "↵-crarr", "⇐-lArr", "⇑-uArr", "⇒-rArr", "⇓-dArr", "⇔-hArr", "∀-forall", "∂-part", "∃-exist", "∅-empty", "∇-nabla", 
            "∈-isin", "∉-notin", "∋-ni", "∏-prod", "∑-sum", "−-minus", "∗-lowast", "√-radic", "∝-prop", "∞-infin", "∠-ang", "∧-and", "∨-or", "∩-cap", "∪-cup", "∫-int", 
            "∴-there4", "∼-sim", "≅-cong", "≈-asymp", "≠-ne", "≡-equiv", "≤-le", "≥-ge", "⊂-sub", "⊃-sup", "⊄-nsub", "⊆-sube", "⊇-supe", "⊕-oplus", "⊗-otimes", "⊥-perp", 
        };
    private static Hashtable _entitiesLookupTable;
    private static object _lookupLockObject = new object();

    internal static char Lookup(string entity)
    {
        if (_entitiesLookupTable == null)
        {
            lock (_lookupLockObject)
            {
                if (_entitiesLookupTable == null)
                {
                    Hashtable hashtable = new Hashtable();
                    foreach (string str in _entitiesList)
                    {
                        hashtable[str.Substring(2)] = str[0];
                    }
                    _entitiesLookupTable = hashtable;
                }
            }
        }
        object obj2 = _entitiesLookupTable[entity];
        if (obj2 != null)
        {
            return (char)obj2;
        }
        return '\0';
    }
}


public sealed class HttpUtility
{
    private static char[] s_entityEndingChars = new char[] { ';', '&' };

    public static string HtmlDecode(string s)
    {
        if (s == null)
        {
            return null;
        }
        if (s.IndexOf('&') < 0)
        {
            return s;
        }
        StringBuilder sb = new StringBuilder();
        StringWriter output = new StringWriter(sb);
        HtmlDecode(s, output);
        return sb.ToString();
    }

    public static void HtmlDecode(string s, TextWriter output)
    {
        if (s != null)
        {
            if (s.IndexOf('&') < 0)
            {
                output.Write(s);
            }
            else
            {
                int length = s.Length;
                for (int i = 0; i < length; i++)
                {
                    char ch = s[i];
                    if (ch == '&')
                    {
                        int num3 = s.IndexOfAny(s_entityEndingChars, i + 1);
                        if ((num3 > 0) && (s[num3] == ';'))
                        {
                            string entity = s.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);
                                    }
                                    else
                                    {
                                        ch = (char)int.Parse(entity.Substring(1));
                                    }
                                    i = num3;
                                }
                                catch (FormatException)
                                {
                                    i++;
                                }
                                catch (ArgumentException)
                                {
                                    i++;
                                }
                            }
                            else
                            {
                                i = num3;
                                char ch2 = HtmlEntities.Lookup(entity);
                                if (ch2 != '\0')
                                {
                                    ch = ch2;
                                }
                                else
                                {
                                    output.Write('&');
                                    output.Write(entity);
                                    output.Write(';');
                                    goto Label_0103;
                                }
                            }
                        }
                    }
                    output.Write(ch);
                Label_0103: ;
                }
            }
        }
    }
}
Jader Dias
@Jader: I had done that before your suggestion. Another guy suggested to me. But he removed their comment. So, I'll accept your answer as the better way.
Zanoni
of course you'll want to remove that Hashtable and replace with Dictionary<string, char>. And also get rid of the goto and replace with a continue.
Bryan
@Bryan Certainly I'll not want to change Microsoft's code. I will leave it exactly as it was written.
Jader Dias
A: 

I've used reflector in the past to find just the methods I need from the framework that aren't included and compile them directly into my compact.net project.

dkackman
A: 

NICE, BUT HOW TO ENCODE THE STRING TO HTML? Thanks

RAFAEL SACCOMANI