using System;
using System.Globalization;
using System.Text;
public static class CodeHelper
{
public static string ToLiteral(this string input)
{
var 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:
if (Char.GetUnicodeCategory(c) != UnicodeCategory.Control)
{
literal.Append(c);
}
else
{
literal.Append(@"\u");
literal.Append(((ushort)c).ToString("x4"));
}
break;
}
}
literal.Append("\"");
return literal.ToString();
}
}
0
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();
}
}
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 + "\"");
}
}
15 回答
我找到了这个:
这段代码:
生产环境 :
Regex.Escape(String)怎么样?
编辑:一种更结构化的方法,包括
string
和char
的所有转义序列 .也没有煮鸡蛋 .
尝试:
Hallgrim的答案非常好,但“”,换行符和缩进添加功能对我来说是破坏功能的 . 一个简单的方法是:
Hallgrim的回答很棒 . 如果您需要使用c#正则表达式解析其他空格字符和换行符,这是一个小调整 . 我需要这个在序列化的Json值的情况下插入谷歌表,并在代码插入标签,空格等时遇到麻烦 .
完全工作的实现,包括转义Unicode和ASCII不可打印字符 . 不插入像Hallgrim's answer这样的"+"标志 .
有趣的问题 .
如果找不到更好的方法,可以随时更换 .
如果你选择它,你可以使用这个 C# Escape Sequence List :
' - 单引号,字符文字所需
\“ - 双引号,字符串文字需要
\ - 反斜杠
\ 0 - Unicode字符0
\ a - 警报(字符7)
\ b - 退格(字符8)
\ f - 换页(字符12)
\ n - 新行(字符10)
\ r - 回车(字符13)
\ t - 水平制表符(字符9)
\ v - 垂直引号(字符11)
\ uxxxx - 十六进制值为xxxx的字符的Unicode转义序列
\ xn [n] [n] [n] - 具有十六进制值nnnn的字符的Unicode转义序列(\ uxxxx的可变长度版本)
\ Uxxxxxxxx - 具有十六进制值xxxxxxxx的字符的Unicode转义序列(用于生成代理)
这个列表可以在C#常见问题中找到What character escape sequences are available?
对于Smilediver的答案,这是一个小小的改进,它不会逃避所有的非ASCII字符,但只有这些才真正需要 .
我将ToVerbatim添加到 Hallgrim's 的尝试接受了以上答案:
如果JSON约定对于你想要转义的非转义字符串是足够的,并且你已经在项目中使用了
Newtonsoft.Json
(它有相当大的开销),你可以像下面这样使用这个包:我提交了自己的实现,它处理
null
值,并且由于使用了数组查找表,手动十六进制转换和避免switch
语句而应该更高效 .Code:
Output:
这是你想要的吗?