Since a string is basically a character array, I would do away with the stringreader and simply loop through the string itself:
static string ReplaceAllSpaces(string input)
{
StringBuilder builder = new StringBuilder();
bool continuousSpace = false;
foreach (char c in input)
{
if (!continuousSpace && char.IsWhiteSpace(c))
{
builder.Append("%20");
continuousSpace = true;
}
else if(!char.IsWhiteSpace(c))
{
builder.Append(c);
continuousSpace = false;
}
}
return builder.ToString();
}
A side note: Whitespace includes a lot of other characters in the unicode set as well as the space.
White space characters are the following Unicode characters:
Members of the SpaceSeparator category, which includes the characters
SPACE (U+0020), OGHAM SPACE MARK (U+1680), MONGOLIAN VOWEL
SEPARATOR (U+180E), EN QUAD (U+2000), EM QUAD (U+2001), EN SPACE
(U+2002), EM SPACE (U+2003), THREE-PER-EM SPACE (U+2004), FOUR-PER-EM
SPACE (U+2005), SIX-PER-EM SPACE (U+2006), FIGURE SPACE (U+2007),
PUNCTUATION SPACE (U+2008), THIN SPACE (U+2009), HAIR SPACE (U+200A),
NARROW NO-BREAK SPACE (U+202F), MEDIUM MATHEMATICAL SPACE (U+205F),
and IDEOGRAPHIC SPACE (U+3000).
Members of the LineSeparator category, which consists solely of the LINE SEPARATOR character (U+2028).
Members of the ParagraphSeparator category, which consists solely of the PARAGRAPH SEPARATOR character (U+2029).
The characters CHARACTER TABULATION (U+0009), LINE FEED (U+000A), LINE TABULATION (U+000B), FORM FEED (U+000C), CARRIAGE RETURN
(U+000D), NEXT LINE (U+0085), and NO-BREAK SPACE (U+00A0).
input.Replace(" ", "%20");
won't? \$\endgroup\$%20
. Is this the desired behaviour? Usually each space would be replaced by a single%20
. \$\endgroup\$