【问题标题】:How to detect SUB character and remove it from a text file in C#?如何检测 SUB 字符并将其从 C# 中的文本文件中删除?
【发布时间】:2012-08-14 08:08:53
【问题描述】:

我正在编写一个程序来处理特殊的文本文件。其中一些文本文件以 SUB 字符(替代字符。它可能是 0x1A)结尾。如何使用 C# 检测此字符并将其从文本文件中删除?

【问题讨论】:

  • 当你说它可能是0x1A - 当你读它时它实际上 U+001A,还是不是?
  • 我看不到它是什么。当我在 Notepad++ 中打开这个文件时,它显示为 SUB。我在网上研究了特殊的 SUB 字符,它指出 SUB 是一个特殊的 UNIX 类字符,它是 ASCII 的 26,它是十六进制的 0X1A,它是 Ctrl+Z。但是那我怎么检测 ctrl+z 呢?
  • "Ctrl+Z" 不是字符,它是在键盘上按下。您应该在 binary 文件编辑器中打开该文件,以检查它是否真的是字节 1A。
  • 你在说换行符???字符 10??只需 Ctrl+H,进入扩展模式并写入 \n 并在任何地方替换它......
  • 从一些“巧妙”构造的文件中删除 0x1A 可能会使文件不可读。很久以前,在一个遥远的星系中,0x1A 被用来表示文本流中的文件结束 (EOF)。后来,有些人在他们的二进制文件上放了一个文本头,用 0x1A 字符将文本与二进制文件分开。文本阅读器会读取并显示文件中的字符,直到遇到 0x1A。最终结果:您可以使用 MSDOS 的“type”命令来显示二进制文件并查看文本标题/描述,而不必费力地穿过屏幕上的大量哔哔声和垃圾字符。

标签: c# string text


【解决方案1】:

如果它在二进制数据中确实是 0x1A,并且如果您将其作为 ASCII 或 UTF-8 文件读取,则在 .NET 中读取时它应该以 U+001A 结尾。所以你也许可以写出类似的东西:

string text = File.ReadAllText("file.txt");
text = text.Replace("\u001a", "");
File.WriteAllText("file.txt", text);

请注意,"\u001a" 部分是由单个字符组成的字符串:\uxxxx 是单个 UTF-16 代码点的转义序列,给定的 Unicode 值以十六进制表示。

【讨论】:

  • 感谢您的回答。我认为这会奏效,我会尝试一下。
【解决方案2】:

最简单的答案可能是正则表达式:

public static string RemoveAll(this string input, char toRemove)
{
   //produces a pattern like "\x1a+" which will match any occurrence
   //of one or more of the character with that hex value
   var pattern = @"\x" + ((int)toRemove).ToString("x") + "+";

   return Regex.Replace(input, pattern, String.Empty);
}

//usage
var cleanString = dirtyString.RemoveAll((char)0x1a);

是的,你可以只传入 int,但这需要知道字符的整数值。使用 char 作为参数,您可以指定一个字面量或 char 变量,减少垃圾。

【讨论】:

  • 我不明白为什么这里需要正则表达式。这不像我们在这里寻找一个 pattern - 你可以用空字符串替换一个字符串。如果要使其可变,可以轻松使用ToString
  • 如果有多个相邻的匹配项,Regex 不会一次性将它们全部删除,而不是一次遍历一个字符的字符串吗?
  • 嗯,它必须一次遍历一个字符 - 是什么让您认为 Regex.Replace 方法比 String.Replace 更有效?这不像我建议每次出现单独的 String.Replace 调用......
  • 在这种情况下,一个字符的正则表达式可能会增加一些开销
【解决方案3】:

C# 有一种方法可以检测控制字符(包括 SUB)。 见msdn:https://msdn.microsoft.com/en-us/library/9s05w2k9(v=vs.110).aspx

【讨论】:

    【解决方案4】:

    你也可以试试这样应该可以的

    using (FileStream f = File.OpenRead("path\\file")) //Your filename + extension  
    {
        using (StreamReader sr = new StreamReader(f)) 
        {
            string text = sr.ReadToEnd();
            text = text.Replace("\u001a", string.Empty);
        }
    }
    

    【讨论】:

    • 我不相信有string.Replace(char, string) 方法。请注意,使用File.ReadAllText 会使代码更简单。
    • John 我会仔细检查以确保并让您知道稍等片刻.. 是的 File.ReadAllText 更简单我只是提供不同的建议..
    • @JonSkeet 我更改了代码.. 感谢您的关注.. +1 给你
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-26
    • 1970-01-01
    • 2020-10-13
    • 2013-03-23
    • 2017-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多