从字符串中删除隐藏的字符
我的问题:
我有一个.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()
方法的文档 。
或者,如果您只想保留字母和数字,还可以使用IsLetter
和IsDigit
函数:
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)导致我的应用程序中断,这行代码删除了字符