Frequently, when working with Office, SharePoint, and SharePoint web services, it is necessary to convert between the "normalized" (hex escaped string) version of a field name.
To that end, I found a useful JavaScript tool for normalizing strings into SharePoint's "static name" format.
In .Net, we can simplify this using Regex and Uri.
private static readonly Regex specialCharactersPattern
= new Regex("[\\[*($%&)<>!?\\/\"{}\\s+-='@~`#\\\\:;^\\]]",
RegexOptions.Compiled);
private static readonly Regex encodedCharactersPattern
= new Regex("_x00(\\d{2})_", RegexOptions.Compiled);
/// <summary>
/// Normalizes the name of the SharePoint property name.
/// </summary>
/// <param name="key">The "human readable" key/property name.</param>
/// <returns>
/// The string with hex representation in place of special ASCII
/// characters.
/// </returns>
private static string NormalizeSharePointPropertyName(string key) {
return specialCharactersPattern.Replace(key, ReplaceSpecialCharacter);
}
/// <summary>
/// Custom match evaluator to replace special characters within the input
/// string.
/// </summary>
/// <param name="match">The pattern match.</param>
/// <returns>The formatted version of the string.</returns>
private static string ReplaceSpecialCharacter(Match match) {
string replacement = string.Format("_x00{0}_",
Uri.HexEscape(match.Value[0]).TrimStart('%'));
return replacement;
}
/// <summary>
/// Denormalizes the name of the SharePoint property.
/// </summary>
/// <param name="key">The normalized key/property name (static name).</param>
/// <returns>
/// The denormalized form of the input string ("human readable"
/// with hex patterns replaced).
/// </returns>
private static string DenormalizeSharePointPropertyName(string key) {
return encodedCharactersPattern.Replace(key, DecodeSpecialCharacter);
}
/// <summary>
/// Custom match evaluator to replace the hex characters with special characters.
/// </summary>
/// <param name="match">The pattern match.</param>
/// <returns>The ASCII format of the special character encoded in hex.</returns>
private static string DecodeSpecialCharacter(Match match) {
int start = 0;
string replacement =
Convert.ToString(
Uri.HexUnescape(Convert.ToString(match.Value[0]), ref start)
);
return replacement;
}
Download the sample console project to test it out.
SharePointNormalizationConsole.zip (4.35 KB)