【问题标题】:Entitize arbitrary .NET string [duplicate]实体化任意.NET字符串[重复]
【发布时间】:2012-06-10 10:28:33
【问题描述】:

可能重复:
Can I convert a C# string value to an escaped string literal

如何使任意字符串实体化以获得与调试器类似的精确人类可读视图? IE。我希望所有特殊字符都被实体化:

"Hello,\r\nworld"
"Hello,#D$#A$world"
"Hello,0x0D0x0Aworld"

任何这样的输出都可以。我只对 BCL 中的标准函数感兴趣(可能是现有序列化程序或帮助程序类中的一些转义例程,等等)。反向功能也很酷。

【问题讨论】:

  • “实体化”是什么意思?您希望输出是什么?
  • 查看输出样本。我想获得一个视图,以便我确定字符串中的每个字符(甚至不可打印)。需要这个来记录。
  • “特殊字符”是什么意思?您将查看哪些需要转义的日志?
  • "\n" 在运行时不存在,它将是一个换行符。
  • 谢谢,莱斯德里德!正是我需要的。 HttpUtility.JavaScriptStringEncode() 可以完成这项工作,但需要 System.Web。抱歉,您可能会提出令人困惑的问题。

标签: c# .net string .net-4.0 escaping


【解决方案1】:

我认为没有现成的解决方案可以满足您的需求。 Char.Isxxx 可用于查找需要特殊处理的字符,自定义代码可以将它们替换为您想要查看的信息。

下面的代码可以很好地作为示例,但 Unicode 中有许多不同的字符,以确保它涵盖所有情况。

var s = @"Hello,
world";

var builder = new StringBuilder();

foreach (var c in s)
{
    if (Char.IsLetterOrDigit(c) || Char.IsPunctuation(c))
        builder.Append(c);
    else
    {
        var newStr = string.Format("#{0}$", ((int)c).ToString("X"));
        builder.Append(newStr);
    }
}
Console.WriteLine(builder.ToString());

结果显示在控制台中:

Hello,#D$#A$world

【讨论】:

    【解决方案2】:

    你可以使用一系列String.Replaces:

    string Entitize(string input)
    {
        return input.Replace("\n", "\\n").Replace("\r", "\\r"), ... ;
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-17
      • 2012-05-10
      • 1970-01-01
      • 1970-01-01
      • 2013-04-15
      • 2021-06-21
      • 2013-05-23
      相关资源
      最近更新 更多