【问题标题】:How do I include a string in an escape sequence in c#如何在 c# 的转义序列中包含一个字符串
【发布时间】:2021-12-20 22:52:29
【问题描述】:

我有一个字符串,它是变量和文本的组合,如下所示:

string str = $"\x0{str2}{str3}";

如您所见,我有一个 \x 的字符串转义序列,它需要 1-4 个十六进制字符。 str2 是一个十六进制字符(例如D),而str3 是两个十进制字符(例如37)。我期望str = "\x0D37" 的结果是str 包含,但我得到的是空格,就像str == "\x0" 一样。这是为什么呢?

【问题讨论】:

  • 这是因为转义转换发生在编译时。你必须找到另一种方法来做到这一点。

标签: c# string unicode-escapes


【解决方案1】:

回答为什么您的示例不起作用:

规范将\x 称为“hexadecimal escape sequence”。

十六进制转义序列表示单个 Unicode 字符,其值由“\x”后面的十六进制数字组成。

语法只允许以这种方式使用文字十六进制数字。 ANTLR 语法:

hexadecimal_escape_sequence
    : '\\x' hex_digit hex_digit? hex_digit? hex_digit?;

hex_digit
    : '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9'
    | 'A' | 'B' | 'C' | 'D' | 'E' | 'F' | 'a' | 'b' | 'c' | 'd' | 'e' | 'f';

意思是“\x 后面紧跟一个、两个、三个或四个十六进制数字的序列”。因此,转义只能用作源代码中的文字,而不能在运行时连接。

Charlieface 为您的情况提供了一个很好的替代方案,但根据具体情况,您可能需要重新考虑您的组织,只使用一个字符串来保存字符而不是两个。

【讨论】:

    【解决方案2】:

    As per the specification,一个插值字符串在解析之前被分割成单独的标记。要解析\x 转义序列,它需要是同一个令牌的一部分,在这种情况下它不是。而且无论如何,插值部分根本不可能使用转义序列,因为非文字没有定义。

    你最好直接生成一个char 值,尽管这更复杂

    string str = ((char) (int.Parse(str2 + str3, NumberStyles.HexNumber))).ToString();
    

    【讨论】:

      猜你喜欢
      • 2012-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多