首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >是否可以将C#字符串值转换为转义字符串文字?

是否可以将C#字符串值转换为转义字符串文字?
EN

Stack Overflow用户
提问于 2008-11-27 12:39:37
回答 12查看 203.2K关注 0票数 211

在C#中,我可以像在代码中看到的那样,将字符串值转换为字符串文字吗?我想用制表符、换行符等替换它们的转义序列。

如果此代码:

代码语言:javascript
复制
Console.WriteLine(someString);

产生:

代码语言:javascript
复制
Hello
World!

我想要这个代码:

代码语言:javascript
复制
Console.WriteLine(ToLiteral(someString));

生产:

代码语言:javascript
复制
\tHello\r\n\tWorld!\r\n
EN

回答 12

Stack Overflow用户

回答已采纳

发布于 2008-11-27 23:40:45

我发现了这个:

代码语言:javascript
复制
private static string ToLiteral(string input)
{
    using (var writer = new StringWriter())
    {
        using (var provider = CodeDomProvider.CreateProvider("CSharp"))
        {
            provider.GenerateCodeFromExpression(new CodePrimitiveExpression(input), writer, null);
            return writer.ToString();
        }
    }
}

这段代码:

代码语言:javascript
复制
var input = "\tHello\r\n\tWorld!";
Console.WriteLine(input);
Console.WriteLine(ToLiteral(input));

产生:

代码语言:javascript
复制
    Hello
    World!
"\tHello\r\n\tWorld!"
票数 197
EN

Stack Overflow用户

发布于 2008-11-27 12:49:38

一个更结构化的方法,包括stringchar的所有转义序列,是:

它不会将Unicode字符替换为与其等效的文字。它也不会煮鸡蛋。

代码语言:javascript
复制
public class ReplaceString
{
    static readonly IDictionary<string, string> m_replaceDict
        = new Dictionary<string, string>();

    const string ms_regexEscapes = @"[\a\b\f\n\r\t\v\\""]";

    public static string StringLiteral(string i_string)
    {
        return Regex.Replace(i_string, ms_regexEscapes, match);
    }

    public static string CharLiteral(char c)
    {
        return c == '\'' ? @"'\''" : string.Format("'{0}'", c);
    }

    private static string match(Match m)
    {
        string match = m.ToString();
        if (m_replaceDict.ContainsKey(match))
        {
            return m_replaceDict[match];
        }

        throw new NotSupportedException();
    }

    static ReplaceString()
    {
        m_replaceDict.Add("\a", @"\a");
        m_replaceDict.Add("\b", @"\b");
        m_replaceDict.Add("\f", @"\f");
        m_replaceDict.Add("\n", @"\n");
        m_replaceDict.Add("\r", @"\r");
        m_replaceDict.Add("\t", @"\t");
        m_replaceDict.Add("\v", @"\v");

        m_replaceDict.Add("\\", @"\\");
        m_replaceDict.Add("\0", @"\0");

        //The SO parser gets fooled by the verbatim version
        //of the string to replace - @"\"""
        //so use the 'regular' version
        m_replaceDict.Add("\"", "\\\"");
    }

    static void Main(string[] args){

        string s = "here's a \"\n\tstring\" to test";
        Console.WriteLine(ReplaceString.StringLiteral(s));
        Console.WriteLine(ReplaceString.CharLiteral('c'));
        Console.WriteLine(ReplaceString.CharLiteral('\''));

    }
}
票数 27
EN

Stack Overflow用户

发布于 2012-12-30 10:18:37

这是一个完全有效的实现,包括Unicode和ASCII不可打印字符的转义。它不会像Hallgrim's answer那样插入"+“符号。

代码语言:javascript
复制
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 '\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();
}

请注意,这也会转义所有Unicode字符。如果您的环境支持它们,您可以将该部分更改为仅转义控制字符:

代码语言:javascript
复制
// UTF16 control characters
} else if (Char.GetUnicodeCategory(c) == UnicodeCategory.Control) {
    literal.Append(@"\u");
    literal.Append(((int)c).ToString("x4"));
} else {
    literal.Append(c);
}
票数 24
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/323640

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档