我的问题:
我有一个通过电子邮件发出通讯.NET应用程序。 当通讯的前景被视为,Outlook显示代替隐藏字符它无法识别的问号。 这些隐藏字符(S)是从谁复制的最终用户和粘贴HTML,构成了该通讯到表单并提交它的到来。 如果它们出现在字符串的结束或开始一个C#修整()删除这些隐藏的字符。 当通讯在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签名(名字编辑器之间略有不同),这是可以在邮件的开头引起的怪异字符。
串输出=新的字符串(input.Where(C => char.IsControl(c))的ToArray的()!); 这必将解决问题。 我曾在一个字符串非打印替代characer(ASCII 26),这是导致我的应用程序,以打破这行代码删除人物