/// <summary> /// Escape string with backslash sequences (e.g. \r\n -> \\r\\n) /// </summary> /// <param name="s">String to escape</param> /// <param name="stringEscapeOptions">String escape options</param> /// <param name="charEscapeOptions">Char escape options</param> /// <param name="addQuotes">Add quotes after escaping</param> /// <returns>String with escape sequences for string</returns> /// <exception cref="ArgumentNullException"></exception> /// <exception cref="ArgumentException"></exception> public static string Escape(string s, StringEscapeOptions stringEscapeOptions = null, CharEscapeOptions charEscapeOptions = null, bool addQuotes = false) { if (s == null) { throw new ArgumentNullException(nameof(s)); } if (stringEscapeOptions == null) { stringEscapeOptions = new StringEscapeOptions(); } if (charEscapeOptions == null) { charEscapeOptions = new CharEscapeOptions(); } switch (charEscapeOptions.EscapeLanguage) { case CharEscapeLanguage.CSharp: return(EscapeCSharp(s, stringEscapeOptions, charEscapeOptions, addQuotes)); case CharEscapeLanguage.FSharp: return(EscapeFSharp(s, stringEscapeOptions, charEscapeOptions, addQuotes)); case CharEscapeLanguage.PowerShell: return(EscapePowerShell(s, stringEscapeOptions, charEscapeOptions, addQuotes)); default: throw new ArgumentException(string.Format("{0} is not a valid {1}.", charEscapeOptions.EscapeLanguage, nameof(charEscapeOptions.EscapeLanguage)), nameof(charEscapeOptions)); } }
/// <summary> /// Escape string with backslash sequences (e.g. \r\n -> `r`n) /// </summary> /// <param name="s">String to escape</param> /// <param name="stringEscapeOptions">String escape options</param> /// <param name="charEscapeOptions">Char escape options</param> /// <param name="addQuotes">Add quotes after escaping</param> /// <returns>String with escape sequences for string</returns> /// <exception cref="ArgumentException"></exception> private static string EscapePowerShell(string s, StringEscapeOptions stringEscapeOptions, CharEscapeOptions charEscapeOptions, bool addQuotes) { StringBuilder sb = new StringBuilder(s.Length); for (int i = 0; i < s.Length; i++) { if (stringEscapeOptions.EscapeSurrogatePairs && i + 1 < s.Length && char.IsSurrogatePair(s[i], s[i + 1])) { sb.Append(CharUtils.EscapeSurrogatePairPowerShell(s[i], s[++i], charEscapeOptions)); } else { switch (stringEscapeOptions.EscapeKind) { case StringEscapeKind.EscapeAll: sb.Append(CharUtils.EscapePowerShell(s[i], charEscapeOptions)); break; case StringEscapeKind.EscapeNonAscii: if (s[i].IsPrintAscii() && !s[i].IsBacktick() && !s[i].IsDoubleQuote() && !s[i].IsDollarSign()) { sb.Append(s[i]); } else { sb.Append(CharUtils.EscapePowerShell(s[i], charEscapeOptions)); } break; default: throw new ArgumentException(string.Format("{0} is not a valid {1}.", stringEscapeOptions.EscapeKind, nameof(stringEscapeOptions.EscapeKind)), nameof(stringEscapeOptions)); } } } if (addQuotes) { sb.Insert(0, '\"'); sb.Append('\"'); } return(sb.ToString()); }
/// <summary> /// Escape string with backslash sequences (e.g. \r\n -> \\r\\n) /// </summary> /// <param name="s">String to escape</param> /// <param name="stringEscapeOptions">String escape options</param> /// <param name="charEscapeOptions"></param> /// <param name="addQuotes">Add quotes after escaping</param> /// <returns>String with escape sequences for string</returns> /// <exception cref="ArgumentException"></exception> private static string EscapeCSharp(string s, StringEscapeOptions stringEscapeOptions, CharEscapeOptions charEscapeOptions, bool addQuotes) { CharEscapeOptions charEscapeOptionsLowerCaseX4 = new CharEscapeOptions( escapeLanguage: charEscapeOptions.EscapeLanguage, escapeLetter: CharEscapeLetter.LowerCaseX4, escapeLetterFallback: charEscapeOptions.EscapeLetterFallback, surrogatePairEscapeLetter: charEscapeOptions.SurrogatePairEscapeLetter, useLowerCaseHex: charEscapeOptions.UseLowerCaseHex, useShortEscape: charEscapeOptions.UseShortEscape ); StringBuilder sb = new StringBuilder(s.Length); for (int i = 0; i < s.Length; i++) { if (stringEscapeOptions.EscapeSurrogatePairs && i + 1 < s.Length && char.IsSurrogatePair(s[i], s[i + 1])) { sb.Append(CharUtils.EscapeSurrogatePairCSharp(s[i], s[++i], charEscapeOptions)); } else { switch (stringEscapeOptions.EscapeKind) { case StringEscapeKind.EscapeAll: sb.Append(CharUtils.EscapeCSharp(s[i], charEscapeOptions)); break; case StringEscapeKind.EscapeNonAscii: if (s[i].IsPrintAscii() && !s[i].IsBackslash() && !s[i].IsDoubleQuote()) { sb.Append(s[i]); } else { // pay special attention here because \x is variable length: H, HH, HHH, HHHH // if the next char is hex then we don't want to insert it in any of the 'H' spaces // instead we have to output the full fixed length \xHHHH so the next char doesn't become part of this \x sequence if ((charEscapeOptions.EscapeLetter == CharEscapeLetter.LowerCaseX1 || charEscapeOptions.EscapeLetter == CharEscapeLetter.LowerCaseX2 || charEscapeOptions.EscapeLetter == CharEscapeLetter.LowerCaseX3) && i + 1 < s.Length && s[i + 1].IsHex()) { sb.Append(CharUtils.EscapeCSharp(s[i], charEscapeOptionsLowerCaseX4)); } else { sb.Append(CharUtils.EscapeCSharp(s[i], charEscapeOptions)); } } break; default: throw new ArgumentException(string.Format("{0} is not a valid {1}.", stringEscapeOptions.EscapeKind, nameof(stringEscapeOptions.EscapeKind)), nameof(stringEscapeOptions)); } } } if (addQuotes) { sb.Insert(0, '\"'); sb.Append('\"'); } return(sb.ToString()); }