【问题标题】:Translate string literals to their actual values [duplicate]将字符串文字转换为其实际值[重复]
【发布时间】:2014-10-27 14:27:31
【问题描述】:

注意:我不想让问题太长,所以问题标题中的“如何”转换为“.Net 框架中是否有此方法”。

提醒一下:

\n

如果上面是字符串的可打印表示,那么它的内部版本是一个字符,而不是两个,代码是0x0a。

但是我可以写:

string s = "\\n"; // three characters in editor

它转换为 2 个字符 \n 的内部表示。这不是 0x0a 字符!

但我想实现这一点。 IE。我已经在字符串中有一些数据,我知道这是字符串的可打印表示。我想将它转换为内部表示(C# 编译器一直在做的事情)。

string printable = "\\n";
string internal_ = convert(printable);

internal_ 现在只包含一个字符,代码为 0x0a。

问题:是否有准备好使用 (!) 函数进行此类转换?

【问题讨论】:

  • 您可以使用Encoding.GetBytes 方法之一获取字节。
  • @PatrickHofman,它为您提供字符串的字节,但它不解释字符串。这个convert 可以在字符串上多次调用,并且每次调用都会缩短每个元字符。所以简而言之,它做了一些不同的事情。
  • 也许你需要让你的问题更清楚,因为我认为你要求一种方法来获取0x0a,而不是\\n
  • 所以要明确一点:您正在寻找一种将字符串 @"\n" 转换为字符 0x0a 的方法?
  • 为我的项目制作本地化系统时,我使用简单的Replace("\\n", "\xd\xa") 转义/取消转义新行符号(用于转义对面)。通过使用相同的原理,您可以制作更方便的东西。

标签: c# string


【解决方案1】:

您可以尝试使用System.Text.RegularExpressions.Regex.Unescape 静态方法:

string internal_ = Regex.Unescape(printable);

但不幸的是,它主要适用于正则表达式控制字符。

测试:

var chars = internal_.ToCharArray();

chars 数组有 1 个元素,代码为 0x0a

【讨论】:

  • @PatrickHofman,它被称为 UNescape 是有原因的。您将其与“转义”混合在一起:-)。
  • @greenoldman:不,你的问题不清楚。
  • 这是否适用于all string literal variants,例如\uNNNN
  • @CodeCaster 我不确定 all,但对于 \uNNNN 它可以。
【解决方案2】:

这实际上非常复杂,为了解析字符串文字,需要考虑的情况比您描述的要多得多。例如考虑\0x0a。幸运的是,您不是第一个提出此要求的人。 Regex.Unescape 处理最多,但 not all cases。 DeepDiver 的 a blog post 带有解析 C# 文字字符串的代码 - 这应该满足您的要求。

【讨论】:

  • 我知道这是一项复杂的任务,这就是为什么我正在寻找可以使用的东西,而不是重新发明。我仍然希望为此使用 Roslyn,但这将是重量级解决方案:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-15
  • 2013-06-05
相关资源
最近更新 更多