public static string UnescapeDataString (string stringToUnescape)
{
if (stringToUnescape == null)
throw new ArgumentNullException ("stringToUnescape");
if (stringToUnescape.IndexOf ('%') == -1 && stringToUnescape.IndexOf ('+') == -1)
return stringToUnescape;
StringBuilder output = new StringBuilder ();
long len = stringToUnescape.Length;
MemoryStream bytes = new MemoryStream ();
int xchar;
for (int i = 0; i < len; i++) {
if (stringToUnescape [i] == '%' && i + 2 < len && stringToUnescape [i + 1] != '%') {
if (stringToUnescape [i + 1] == 'u' && i + 5 < len) {
if (bytes.Length > 0) {
output.Append (GetChars (bytes, Encoding.UTF8));
bytes.SetLength (0);
}
xchar = GetChar (stringToUnescape, i + 2, 4);
if (xchar != -1) {
output.Append ((char) xchar);
i += 5;
}
else {
output.Append ('%');
}
}
else if ((xchar = GetChar (stringToUnescape, i + 1, 2)) != -1) {
bytes.WriteByte ((byte) xchar);
i += 2;
}
else {
output.Append ('%');
}
continue;
}
if (bytes.Length > 0) {
output.Append (GetChars (bytes, Encoding.UTF8));
bytes.SetLength (0);
}
output.Append (stringToUnescape [i]);
}
if (bytes.Length > 0) {
output.Append (GetChars (bytes, Encoding.UTF8));
}
bytes = null;
return output.ToString ();
}