public string Canonicalize(string input)
        {
            StringBuilder stringBuilder = new StringBuilder();

            Encoder.EncodedStringReader encodedStringReader = new Encoder.EncodedStringReader(input);
            while (encodedStringReader.HasNext())
            {
                Encoder.EncodedCharacter nextCharacter = encodedStringReader.NextCharacter;
                if (nextCharacter != null)
                {
                    stringBuilder.Append(nextCharacter.Unencoded);
                }
            }
            return(stringBuilder.ToString());
        }
        private string EntityEncode(string input, char[] baseChars, char[] immune)
        {
            StringBuilder stringBuilder = new StringBuilder();

            Encoder.EncodedStringReader encodedStringReader = new Encoder.EncodedStringReader(input);
            while (encodedStringReader.HasNext())
            {
                Encoder.EncodedCharacter nextCharacter = encodedStringReader.NextCharacter;
                if (nextCharacter != null)
                {
                    if (this.IsContained(baseChars, nextCharacter.Unencoded) || this.IsContained(immune, nextCharacter.Unencoded))
                    {
                        stringBuilder.Append(nextCharacter.Unencoded);
                    }
                    else
                    {
                        stringBuilder.Append(nextCharacter.GetEncoded(3));
                    }
                }
            }
            return(stringBuilder.ToString());
        }
            private Encoder.EncodedCharacter PeekNextCharacter(char currentCharacter)
            {
                if (this.testCharacter == this.input.Length - 1)
                {
                    ++this.testCharacter;
                    return(new Encoder.EncodedCharacter(currentCharacter));
                }
                switch (currentCharacter)
                {
                case '%':
                    Encoder.EncodedCharacter percent = this.ParsePercent(this.input, this.testCharacter);
                    if (percent != null)
                    {
                        return(percent);
                    }
                    break;

                case '&':
                    return(this.ParseEntity(this.input, this.testCharacter));
                }
                ++this.testCharacter;
                return(new Encoder.EncodedCharacter(currentCharacter));
            }