Can I convert a C# string value to an escaped string literal

后端 未结 16 823
时光取名叫无心
时光取名叫无心 2020-11-22 07:51

In C#, can I convert a string value to a string literal, the way I would see it in code? I would like to replace tabs, newlines, etc. with their escape sequences.

If

相关标签:
16条回答
  • 2020-11-22 07:56

    If JSON conventions are enough for the unescaped strings you want to get escaped and you already use Newtonsoft.Jsonin your project (it has a pretty large overhead) you may use this package like the following:

    using System;
    using Newtonsoft.Json;
    
    public class Program
    {
        public static void Main()
        {
        Console.WriteLine(ToLiteral( @"abc\n123") );
        }
    
        private static string ToLiteral(string input){
            return JsonConvert.DeserializeObject<string>("\"" + input + "\"");
        }
    }
    
    0 讨论(0)
  • public static class StringHelpers
    {
        private static Dictionary<string, string> escapeMapping = new Dictionary<string, string>()
        {
            {"\"", @"\\\"""},
            {"\\\\", @"\\"},
            {"\a", @"\a"},
            {"\b", @"\b"},
            {"\f", @"\f"},
            {"\n", @"\n"},
            {"\r", @"\r"},
            {"\t", @"\t"},
            {"\v", @"\v"},
            {"\0", @"\0"},
        };
    
        private static Regex escapeRegex = new Regex(string.Join("|", escapeMapping.Keys.ToArray()));
    
        public static string Escape(this string s)
        {
            return escapeRegex.Replace(s, EscapeMatchEval);
        }
    
        private static string EscapeMatchEval(Match m)
        {
            if (escapeMapping.ContainsKey(m.Value))
            {
                return escapeMapping[m.Value];
            }
            return escapeMapping[Regex.Escape(m.Value)];
        }
    }
    
    0 讨论(0)
  • 2020-11-22 07:58

    Hallgrim's answer is excellent, but the "+", newline and indent additions were breaking functionality for me. An easy way around it is:

    private static string ToLiteral(string input)
    {
        using (var writer = new StringWriter())
        {
            using (var provider = CodeDomProvider.CreateProvider("CSharp"))
            {
                provider.GenerateCodeFromExpression(new CodePrimitiveExpression(input), writer, new CodeGeneratorOptions {IndentString = "\t"});
                var literal = writer.ToString();
                literal = literal.Replace(string.Format("\" +{0}\t\"", Environment.NewLine), "");
                return literal;
            }
        }
    }
    
    0 讨论(0)
  • 2020-11-22 08:00
    public static class StringEscape
    {
      static char[] toEscape = "\0\x1\x2\x3\x4\x5\x6\a\b\t\n\v\f\r\xe\xf\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\"\\".ToCharArray();
      static string[] literals = @"\0,\x0001,\x0002,\x0003,\x0004,\x0005,\x0006,\a,\b,\t,\n,\v,\f,\r,\x000e,\x000f,\x0010,\x0011,\x0012,\x0013,\x0014,\x0015,\x0016,\x0017,\x0018,\x0019,\x001a,\x001b,\x001c,\x001d,\x001e,\x001f".Split(new char[] { ',' });
    
      public static string Escape(this string input)
      {
        int i = input.IndexOfAny(toEscape);
        if (i < 0) return input;
    
        var sb = new System.Text.StringBuilder(input.Length + 5);
        int j = 0;
        do
        {
          sb.Append(input, j, i - j);
          var c = input[i];
          if (c < 0x20) sb.Append(literals[c]); else sb.Append(@"\").Append(c);
        } while ((i = input.IndexOfAny(toEscape, j = ++i)) > 0);
    
        return sb.Append(input, j, input.Length - j).ToString();
      }
    }
    
    0 讨论(0)
  • 2020-11-22 08:02

    Fully working implementation, including escaping of Unicode and ASCII non printable characters. Does not insert "+" signs like Hallgrim's answer.

        static string ToLiteral(string input) {
            StringBuilder literal = new StringBuilder(input.Length + 2);
            literal.Append("\"");
            foreach (var c in input) {
                switch (c) {
                    case '\'': literal.Append(@"\'"); break;
                    case '\"': literal.Append("\\\""); break;
                    case '\\': literal.Append(@"\\"); break;
                    case '\0': literal.Append(@"\0"); break;
                    case '\a': literal.Append(@"\a"); break;
                    case '\b': literal.Append(@"\b"); break;
                    case '\f': literal.Append(@"\f"); break;
                    case '\n': literal.Append(@"\n"); break;
                    case '\r': literal.Append(@"\r"); break;
                    case '\t': literal.Append(@"\t"); break;
                    case '\v': literal.Append(@"\v"); break;
                    default:
                        // ASCII printable character
                        if (c >= 0x20 && c <= 0x7e) {
                            literal.Append(c);
                        // As UTF16 escaped character
                        } else {
                            literal.Append(@"\u");
                            literal.Append(((int)c).ToString("x4"));
                        }
                        break;
                }
            }
            literal.Append("\"");
            return literal.ToString();
        }
    
    0 讨论(0)
  • 2020-11-22 08:04

    Interesting question.

    If you can't find a better method, you can always replace.
    In case you're opting for it, you could use this C# Escape Sequence List:

    • \' - single quote, needed for character literals
    • \" - double quote, needed for string literals
    • \ - backslash
    • \0 - Unicode character 0
    • \a - Alert (character 7)
    • \b - Backspace (character 8)
    • \f - Form feed (character 12)
    • \n - New line (character 10)
    • \r - Carriage return (character 13)
    • \t - Horizontal tab (character 9)
    • \v - Vertical quote (character 11)
    • \uxxxx - Unicode escape sequence for character with hex value xxxx
    • \xn[n][n][n] - Unicode escape sequence for character with hex value nnnn (variable length version of \uxxxx)
    • \Uxxxxxxxx - Unicode escape sequence for character with hex value xxxxxxxx (for generating surrogates)

    This list can be found in the C# Frequently Asked Questions What character escape sequences are available?

    0 讨论(0)
提交回复
热议问题