【问题标题】:Get char by ignoring escape characters通过忽略转义字符获取 char
【发布时间】:2017-03-09 17:13:35
【问题描述】:

举个例子:

var myString = "foo\rbar";
var myChar = myString[3];
var myCharCode = (int) myChar;

我想获取 CharCode 92 (\) 而不是 13 (\r)。

我怎样才能做到这一点?像这些行感觉不对:

myString = myString.Replace("\r", "\\r");
myString = myString.Replace("\n", "\\n");
//Repeat for every possible escape sequence

完整的上下文:

我无法更改myString,因为我是从旧版 VB6 应用程序的数据库中获取的。在 VB6 中,\r 被视为分隔字符。在 .NET 中,它们被视为 ASCI 13。

可能 VB6 未正确将其保存到数据库中。但是它会正确地读回 VB6 客户端。

【问题讨论】:

  • 您是否尝试过以char[] 的身份从数据库中获取数据?
  • 我正在使用实体框架(DbFirst),我认为这是不可能的@AlessandroD'Andria
  • @ChristianGollhardt 这不仅仅是可能的 - 这是默认行为!如果我有一个字符串 char 92 + char 114,将其保存到数据库中,然后将其读回,我将返回 char 92 + char 114。我不会回复char 13,因为那不是我保存到数据库中的内容...
  • "在 .NET 中,它们被视为 ASCII 13。"这是不正确的。 仅在 C# 中是正确的,作为 literal 字符串。 我认为您的实验表明 '\u000d' 确实是从数据库返回的。 VB6 客户端必须执行与您在 C# 中执行的 .Replace 等效的操作。以这种方式序列化字符串数据有点奇怪。你确定需要吗?

标签: c# .net string escaping ascii


【解决方案1】:

在您给出的示例中,您只需告诉字符串不要将反斜杠视为转义字符。在 C# 中,您可以在字符串前面加上 @

var myString = @"foo\rbar";
var myChar = myString[3];
var myCharCode = (int)myChar;
Console.WriteLine(myCharCode);

但是,鉴于您说过要从数据库中读取此内容,我不确定此答案是否足以满足您的需求 - 但它对您的问题是正确的。如果你只是从数据库中读取它,并且你得到一个 (char)13 那么这是因为它被保存在数据库中......

【讨论】:

  • 我无法将其更改为逐字字符串,我是从数据库中获取的。
  • @ChristianGollhardt 那是我不明白的一点 - 如果你从数据库中读取它并且它是 char 13,那么这是因为它被 保存 到数据库中 -除非你对数据库结果做一些疯狂的处理......
  • 可能旧版 VB6 客户端有一些错误,但它应该是 92,82 而不是 13 @RB
【解决方案2】:

字符串转义在代码中的字符串文字中起作用。您需要使用\\ 在字符串中有单个\

var myString = "foo\\rbar";

您还可以将@ 字符用于未转义的字符串:

var myString = @"foo\rbar";

更多信息在这里:https://msdn.microsoft.com/en-us/library/362314fe.aspx

更新:

如果要将应用程序从 VB6 移植到 C#,则需要转义字符串文字中的特殊字符。 foo\rbar 在 VB6 和 C# 代码中有不同的表示形式。

【讨论】:

    猜你喜欢
    • 2011-07-11
    • 2013-04-18
    • 2019-12-18
    • 2021-07-22
    • 1970-01-01
    • 1970-01-01
    • 2016-03-17
    • 1970-01-01
    • 2019-07-13
    相关资源
    最近更新 更多