/// <summary> /// Encodes a URL string so any characters that require percent encoding are encoded /// </summary> /// <param name="value">Value to encode</param> /// <returns></returns> public static String UrlEncode(String value) { if (!IsUnsafeUrlString(value)) { return(value); } else { char c, d, e; StringBuilder output = new StringBuilder(); for (int i = 0; i < value.Length; i++) { c = value[i]; if (!IsSafeCharacter(c)) { if (c == '%') { if (i <= value.Length - 2) { d = value[i + 1]; e = value[i + 2]; if (IriSpecsHelper.IsHexDigit(d) && IriSpecsHelper.IsHexDigit(e)) { //Has valid hex digits after it so continue encoding normally output.Append(c); } else { //Need to encode a bare percent character output.Append(PercentEncode(c)); } } else { //Not enough characters after a % to use as a valid escape so encode the percent output.Append(PercentEncode(c)); } } else { //Contains an unsafe character so percent encode output.Append(PercentEncode(c)); } } else { //No need to encode safe characters output.Append(c); } } return(output.ToString()); } }
private static bool IsUnsafeUrlString(String value) { char c, d, e; for (int i = 0; i < value.Length; i++) { c = value[i]; if (!IsSafeCharacter(c)) { if (c == '%') { if (i <= value.Length - 2) { d = value[i + 1]; e = value[i + 2]; if (IriSpecsHelper.IsHexDigit(d) && IriSpecsHelper.IsHexDigit(e)) { i += 2; continue; } else { //Expected two hex digits after a % as an escape return(true); } } else { //Not enough characters after a % to use as a valid escape return(true); } } else { //Contains an unsafe character return(true); } } } //All Characters OK return(false); }