Comparison between SPHttpUtility and HTTPUtility – encoding and decoding
There are different ways of encoding and decoding querystring parameters, for example by using SPHttpUtility or HttpUtility.
While programming SharePoint I always tend to use the SPHttpUtility class, but I didn’t know exactly why. Until I accidentally used the HttpUtility and SPHttpUtility at the same time: I noticed some differences.
Encode
SharePoint has a Utilities namespace, Microsoft.SharePoint.Utilities, which provides the SPHttpUtility class. One of the methods in this class is UrlKeyValueEncode with several overloads.
The description of the method
UrlKeyValueEncode(string keyOrValueToEncode)
is ‘Encodes the specified URL query string key or value’.
The HttpUtility class in the namespace System.Web contains a method UrlEnode, also with overloads. The description of
UrlEncode(string str)
is ‘Encodes a URL string’.
The HttpUtility class doesn’t have a method to encode a query string key or value as UrlKeyValueEncode, but this is the best match.
Let’s encode a space:
The result while encoding with HttpUtility is ‘+’, encoding with SPHttpUtility results in a ‘%20’.
One of the major differences is the casing of the encoded characters. SPHttpUtility encodes the characters uppercase, HttpUtility lowercase.
Another difference can be seen in the picture below: HttpUtility doesn’t encode all characters, SPHttpUtility does:
Decode
To decode characters the SPHttpUtility class provides the method
UrlKeyValueDecode(string keyOrValueToDecode)
The couterpart of the UrlEncode method in the HttpUtility class is
UrlDecode(string str)
While encoding results in different outcome, decoding doesn’t.
As can be seen in the picture of the encoded characters above, HttpUtility doesn’t encode e.g. ‘(‘, ‘!’, ‘*’. When decoding these (unencoded) characters with SPHttpUtility the results stay ‘(‘, ‘!’, ‘*’. Check the pictures below.
Encoded with HttpUtility, decoded these characters:
SPHttpUtility encodes characters ‘(‘, ‘!’ and ‘*’ as ‘%28’, ‘%21’ and ‘%2A’. When decoding these characters with SPHttpUtility, but also with HttpUtility, the results are the same:
Summary
Since decoding gives the same results with SPHttpUtility and HttpUtility, why bother the encoding method?
Well, something inside me tells me SharePoint is using it somewhere internally. I didn’t figure out where, but why is the SPHttpUtility implemented if SharePoint easily could use HttpUtility?
Besides some feelings, the SPHttpUtility doesn’t use HttpUtility internally. When checking out the SPHttpUtility.UrlKeyValueEncode with ILSpy, the encoded values, uppercase(!), are listed is the readonly string array s_crgstrUrlHexValue.
Wikipedia has a definition of percent encoding (http://en.wikipedia.org/wiki/Percent-encoding) :
‘Percent-encoding, also known as URL encoding, is a mechanism for encoding information in a Uniform Resource Identifier (URI) under certain circumstances’
According to this article reserved characters (Reserved characters are those characters that sometimes have special meaning) must be encoded…
According to RFC 3986 reserved characters are:
So HttpUtility doesn’t encode the first five characters, SPHttpUtility encodes all reserved characters.
To be compatible with 3986 standard it seems SPHttpUtility is the best option to use.
Great!!
Good Notes.
clearly explained off the differences.
Thank you.