12

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

4

4 回答 4

16

如果它在二进制数据中确实是 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 值以十六进制表示。

于 2012-08-17T21:18:04.303 回答
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 变量,减少垃圾。

于 2012-08-17T21:18:02.493 回答
1

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

于 2015-09-17T13:47:27.300 回答
0

你也可以尝试这样的事情它应该工作

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);
    }
}
于 2012-08-17T21:19:58.467 回答