C# 从字符串中删除隐藏字符

C# 从字符串中删除隐藏字符,c#,.net,string,hidden-characters,C#,.net,String,Hidden Characters,我的问题是: 我有一个.NET应用程序,通过电子邮件发送新闻稿。在outlook中查看新闻稿时,outlook会显示一个问号,以代替无法识别的隐藏字符。这些隐藏字符来自最终用户,他们将构成新闻稿的html复制并粘贴到表单中并提交。如果这些隐藏字符出现在字符串的末尾或开头,c#trim()将删除这些隐藏字符。当在gmail中查看时事通讯时,gmail很好地忽略了它们。在word文档中粘贴这些隐藏字符时,我打开“显示段落标记和隐藏符号”选项,这些符号显示为一个较大矩形中的一个矩形。此外,构成新闻稿的

我的问题是:

我有一个.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());
    string input = string.Empty;

    for (int i = 0; i < 255; i++)
    {
        input += (char)(i);
    }
对于
IsControl()
方法

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

string output = new string(input.Where(c => char.IsLetter(c) || char.IsDigit(c)).ToArray());
您可以这样做:

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

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

顺便说一下,大多数人认为制表符、换行符和回车符是不可打印的字符,但对我来说不是

下面是一个表达式:

string output = Regex.Replace(input, @"[^\u0009\u000A\u000D\u0020-\u007E]", "*");
  • ^
    表示是否存在以下情况之一:
  • \u0009
    是选项卡
  • \u000A
    是换行符
  • \u000D
    是回车
  • \u0020-\u007E
    表示从空格到
    ~
    的所有内容,即ASCII格式的所有内容
看看是否要进行更改。记住,它会去掉所有非ASCII字符

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

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

    for (int i = 0; i < 255; i++)
    {
        input += (char)(i);
    }
string输入=string.Empty;
对于(int i=0;i<255;i++)
{
输入+=(字符)(i);
}

这肯定会解决问题。我的字符串中有一个不可打印的替换字符(ASCII 26),导致我的应用程序中断,这行代码删除了字符,对我来说最有效的是:

string result = new string(value.Where(c =>  char.IsLetterOrDigit(c) || (c >= ' ' && c <= byte.MaxValue)).ToArray());
stringresult=newstring(value.Where(c=>char.isleterordigit(c)| |(c>=''&&c
IsControl会丢失一些控制字符,如从左向右标记(LRM)(在执行复制粘贴时通常隐藏在字符串中的字符)。如果您确定字符串中只有数字和数字,则可以使用IsleterOrdGit

new string(input.Where(c => char.IsLetterOrDigit(c)).ToArray())
如果字符串具有特殊字符,则

new string(input.Where(c => c < 128).ToArray())
新字符串(input.Where(c=>c<128.ToArray())

我用这个又快又脏的oneliner清除了Windows 10 calculator应用程序损坏后留下的LTR/RTL标记的一些输入。这可能离完美还有很远的距离,但足以快速修复:

string cleaned = new string(input.Where(c => !char.IsControl(c) && (char.IsLetterOrDigit(c) || char.IsPunctuation(c) || char.IsSeparator(c) || char.IsSymbol(c) || char.IsWhiteSpace(c))).ToArray());

在此举一个例子..示例无效值会更好。我猜测ascii文本中的unicode字符串,但这只是一个猜测。regex,只允许字母和数字可能重复我不知道隐藏字符是什么。它只在outlook或word中显示一次。如果我在SharePoint列表(存储位置)中查看文本它是隐藏的。谢谢,我将尝试此操作。我将尝试对其进行编码并立即解码,以查看隐藏的字符是否被剥离。HtmlEncode/Decode不会删除任何字符,不确定您建议如何使用它。我不知道为什么,但char.IsControl从左到右返回falsemark@YannickBlondeau这也将删除标点和符号特殊字符“£$%^”等。因此,我认为最好的解决方案是2的组合,或者我给出的答案added@IgorMeszarosLRM是一个“格式”字符,但幸运的是C#有一个getUnicodeCegory(char C)方法,可以识别任何字符的类别。
string clean=新字符串(e.Value.Where(C=>char.getUnicodeCegory(C))!=UnicodeTegory.Format).ToArray();
可以很好地删除LRM。我认为第一个^s会反转集合,而其他^s不应该在那里(将从输出中排除^s)。不幸的是,从我的单元测试中,最后一个建议(
新字符串(input.Where(c=>c<128.ToArray())
)还将去掉重音字符。例如,“Siñalizacíon”将变成“Sializacon”。这与。