C# 从字符串中删除非ASCII字符

C# 从字符串中删除非ASCII字符,c#,string,non-ascii-characters,C#,String,Non Ascii Characters,我试图从文本文件中读取的字符串中去掉非ASCII字符,但无法让它这样做。我查看了SO和其他网站的帖子中的一些建议,但都没有结果 这就是我所拥有和尝试的: 文本文件中的字符串: 2021-03-26 10:00:16:648|2021-03-26 10:00:14:682|MPE->IDC|[10.20.30.40:41148]|203, ? ?'F?~?^?W?|?8wL ?i??{?=kb ? Y R? 从文件中读取的字符串: "2021-03-26 10:00:1

我试图从文本文件中读取的字符串中去掉非ASCII字符,但无法让它这样做。我查看了SO和其他网站的帖子中的一些建议,但都没有结果

这就是我所拥有和尝试的:

文本文件中的字符串:

2021-03-26 10:00:16:648|2021-03-26 10:00:14:682|MPE->IDC|[10.20.30.40:41148]|203, ?  ?'F?~?^?W?|?8wL?i??{?=kb ?   Y  R?
从文件中读取的字符串:

"2021-03-26 10:00:16:648|2021-03-26 10:00:14:682|[10.20.30.40:41148]|203,\u0016\u0003\u0001\0?\u0001\0\0?\u0003\u0001'F?\u001e~\u0018?^?W\u0013?|?8wL\v?i??{?=kb\t?\tY\u0005\0\0R?"
清除非ASCII字符的方法:

Regex reAsciiPattern = new Regex(@"[^\u0000-\u007F]+");  // Non-ASCII characters
sLine = reAsciiPattern.Replace(sLine, "");   // remove non-ASCII chars

Regex reAsciiPattern2 = new Regex(@"[^\x00-\x7F]+");  // Non-ASCII characters
sLine = reAsciiPattern2.Replace(sLine, "");   // remove non-ASCII chars

string asAscii = Encoding.ASCII.GetString(
    Encoding.Convert(
        Encoding.UTF8,
        Encoding.GetEncoding(
            Encoding.ASCII.EncodingName,
            new EncoderReplacementFallback(string.Empty),
            new DecoderExceptionFallback()
            ),
        Encoding.UTF8.GetBytes(sLine)
    )
);
我错过了什么


谢谢。

您可以使用以下正则表达式删除所有不可打印的字符

Regex.Replace(sLine, @"[^\u0020-\u007E]+", string.Empty);

您可以使用以下正则表达式去除所有不可打印的字符

Regex.Replace(sLine, @"[^\u0020-\u007E]+", string.Empty);

这可以在不使用
Regex的情况下使用循环和
StringBuilder
完成:

var sb=new StringBuilder();
foreach(var ch in line){
//可打印Ascii范围
如果(ch>=32&&ch<127){
某人附加(ch);
} 
}
line=sb.ToString();
或者您可以使用一些LINQ:

line=string.Concat(
其中(ch=>ch>=32&&ch<127)
);
如果必须使用Regex执行此操作,那么以下内容就足够了(同样,这只保留可打印的ASCII)

line=Regex.Replace(第行,@“[^\u0020-\u007e]”,“”);

如果需要所有ASCII(包括不可打印的)字符,请将测试修改为

ch <= 127 // for the loops
@"[^\u0000-\u007f]" // for the regex

ch这可以在不使用
Regex的情况下使用循环和
StringBuilder
完成:

var sb=new StringBuilder();
foreach(var ch in line){
//可打印Ascii范围
如果(ch>=32&&ch<127){
某人附加(ch);
} 
}
line=sb.ToString();
或者您可以使用一些LINQ:

line=string.Concat(
其中(ch=>ch>=32&&ch<127)
);
如果必须使用Regex执行此操作,那么以下内容就足够了(同样,这只保留可打印的ASCII)

line=Regex.Replace(第行,@“[^\u0020-\u007e]”,“”);

如果需要所有ASCII(包括不可打印的)字符,请将测试修改为

ch <= 127 // for the loops
@"[^\u0000-\u007f]" // for the regex

ch这是基于一篇帖子对我有用的东西


这就是我在一篇帖子中所做的


由于
字符串
是一个
IEnumerable
,其中每个
字符
表示一个UTF-16代码单元(可能是一个代理),您还可以执行以下操作:

var ascii = new string(sLine.Where(x => x <= sbyte.MaxValue).ToArray());

由于
字符串
是一个
IEnumerable
,其中每个
字符
表示一个UTF-16代码单元(可能是一个代理),您还可以执行以下操作:

var ascii = new string(sLine.Where(x => x <= sbyte.MaxValue).ToArray());

我认为你把ASCII和“可打印”混淆了。你的字符是ascii,只是不可打印。我认为你把ascii和“可打印”混淆了。您拥有的字符是ascii,只是不可打印。我列出的第一个正则表达式不包括这些字符吗?谢谢大家的回复。我相信正如Poul Bak所评论的,我把非ascii和不可打印混淆了。最后,我在另一个SO post()上找到了解决方案。我发布了解决方案。我列出的第一个正则表达式不包括这些吗?谢谢大家的回复。我相信正如Poul Bak所评论的,我把非ascii和不可打印混淆了。最后,我在另一个SO post()上找到了解决方案。我发布了解决方案。