从字符串中删除隐藏的字符

我的问题:

我有一个.NET应用程序,通过电子邮件发送新闻稿。 在Outlook中查看简报时,Outlook会显示一个问号,代替无法识别的隐藏字符。 这些隐藏的角色来自最终用户,他们将构成简报的html复制并粘贴到表单中并提交。 如果c#trim()出现在字符串的结尾或开头,则会删除这些隐藏的字符。 在gmail中查看简报时,gmail可以很好地忽略它们。 当粘贴word文档中的这些隐藏字符并打开“显示段落标记和隐藏符号”选项时,符号在较大的矩形内显示为一个矩形。 组成简报的文本也可以是任何语言,因此接受Unicode字符是必须的。 我已经尝试循环遍历字符串以检测字符,但循环不识别它并传递它。 还要求最终用户在提交之前先将html粘贴到记事本中是不可能的。

我的问题:
如何使用C#检测并消除这些隐藏的字符?

您可以使用以下内容从输入字符串中删除所有控制字符:

string input; // this is your input string string output = new string(input.Where(c => !char.IsControl(c)).ToArray()); 

这是 IsControl()方法的文档 。

或者,如果您只想保留字母和数字,还可以使用IsLetterIsDigit函数:

 string output = new string(input.Where(c => char.IsLetter(c) || char.IsDigit(c)).ToArray()); 

我通常使用这个正则表达式来替换所有不可打印的字符。

顺便说一句,大多数人认为标签,换行和回车是不可打印的字符,但对我来说它们不是。

所以这是表达式:

 string output = Regex.Replace(input, @"[^\u0009\u000A\u000D\u0020-\u007E]", "*"); 
  • ^表示如果是以下任何一项:
  • \u0009是标签
  • \u000A是换行
  • \u000D是回车
  • \u0020-\u007E表示从空间到~所有内容 – 即ASCII中的所有内容。

如果要进行更改,请参阅ASCII表 。 请记住,它会剥离每个非ASCII字符。

要测试上面你可以自己创建一个字符串,如下所示:

  string input = string.Empty; for (int i = 0; i < 255; i++) { input += (char)(i); } 
 new string(input.Where(c => !char.IsControl(c)).ToArray()); 

IsControl错过了一些控制字符,如从左到右标记(LRM)(在复制粘贴时通常隐藏在字符串中的字符)。 如果您确定您的字符串只有数字和数字,那么您可以使用IsLetterOrDigit

 new string(input.Where(c => char.IsLetterOrDigit(c)).ToArray()) 

如果你的字符串有特殊字符,那么

 new string(input.Where(c => c < 128).ToArray()) 

你可以这样做:

 var hChars = new char[] {...}; var result = new string(yourString.Where(c => !hChars.Contains(c)).ToArray()); 

最适合我的是:

 string result = new string(value.Where(c => char.IsLetterOrDigit(c) || (c >= ' ' && c <= byte.MaxValue)).ToArray()); 

我确定这个字符是任何字母或数字的地方,这样我就不会忽略任何非英文字母,或者如果它不是字母,我会检查它是否是一个大于或等于空格的ascii字符以确保我忽略了一些控制字符,这确保我不会忽略标点符号。

有人建议使用IsControl检查字符是否不可打印,但忽略了从左到右标记。

如果你知道这些字符是什么,你可以使用string.Replace

 newString = oldString.Replace("?", ""); 

哪里“?” 表示要删除的字符。

这种方法的缺点是,如果要删除多个字符,则需要重复进行此调用。

已经有一段时间了,但尚未得到答复。

如何在发送代码中包含HMTL内容? 如果您从文件中读取它,请检查文件编码。 如果您使用带签名的UTF-8(名称在编辑器之间略有不同),这可能会导致邮件开头的奇怪字符。

string output = new string(input.Where(c =>!char.IsControl(c))。ToArray()); 这肯定会解决问题。 我在一个字符串中有一个不可打印的替换字符(ASCII 26)导致我的应用程序中断,这行代码删除了字符