如何从string中去除非ASCII字符? (在C#中)

如何从string中去除非ASCII字符? (在C#中)

string s = "søme string"; s = Regex.Replace(s, @"[^\u0000-\u007F]+", string.Empty); 

这是一个不使用正则expression式的纯.NET解决scheme:

  string inputString = "Räksmörgås"; string asAscii = Encoding.ASCII.GetString( Encoding.Convert( Encoding.UTF8, Encoding.GetEncoding( Encoding.ASCII.EncodingName, new EncoderReplacementFallback(string.Empty), new DecoderExceptionFallback() ), Encoding.UTF8.GetBytes(inputString) ) ); 

它可能看起来很麻烦,但应该是直观的。 它使用.NET ASCII编码转换string。 在转换过程中使用UTF8,因为它可以表示任何原始字符。 它使用EncoderReplacementFallback将任何非ASCII字符转换为空string。

我相信MonsCamus的意思是:

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

如果你不想去掉,但实际上把latin转换成非重音字符,看看这个问题: 如何将8bit字符转换成7bit字符? (即Ü到U)

受philcruz正则expression式解决scheme的启发,我制作了一个纯粹的LINQ解决scheme

  public static string PureAscii(this string source, char nil = ' ') { var min = '\u0000'; var max = '\u007F'; return source.Select(c => c < min ? nil : c > max ? nil : c).ToText(); } public static string ToText(this IEnumerable<char> source) { var buffer = new StringBuilder(); foreach (var c in source) buffer.Append(c); return buffer.ToString(); } 

这是未经testing的代码。

不需要正则expression式。 只是使用编码…

 sOutput = System.Text.Encoding.ASCII.GetString(System.Text.Encoding.ASCII.GetBytes(sInput)); 

我发现以下稍微更改的范围对于从数据库中parsing注释块非常有用,这意味着您不必与导致CSV字段变得不适应的制表符和转义字符竞争。

 parsememo = Regex.Replace(parsememo, @"[^\u001F-\u007F]", string.Empty); 

如果你想避免其他特殊字符或特定的标点符号检查ascii表

这不是最佳的性能方面,而是一个非常直接的Linq方法:

 string strippedString = new string( yourString.Where(c => c <= sbyte.MaxValue).ToArray() ); 

缺点是所有的“幸存”字符首先被放入一个char[]types的数组中,然后在string构造函数不再使用它时抛出。

我用这个正则expression式:

  string s = "søme string"; Regex regex = new Regex(@"[^a-zA-Z0-9\s]", (RegexOptions)0); return regex.Replace(s, ""); 

我来到这里寻找扩展ASCII字符的解决scheme,但无法find它。 我发现最近的是bzlm的解决scheme 。 但是,这只适用于ASCII码高达127(显然你可以replace他的代码中的编码types,但我认为这是有点复杂的理解,因此,共享这个版本)。 这是一个适用于扩展ASCII码的解决scheme,也就是ISO 8859-1的 255

它find并删除非ASCII字符(大于255)

 Dim str1 as String= "â, ??î or ôu🕧  n☁i✑💴++$-💯♓!🇪🚑🌚‼⁉4⃣od;/⏬'®;😁☕😁:☝)😁😁///😍1!@#" Dim extendedAscii As Encoding = Encoding.GetEncoding("ISO-8859-1", New EncoderReplacementFallback(String.empty), New DecoderReplacementFallback()) Dim extendedAsciiBytes() As Byte = extendedAscii.GetBytes(str1) Dim str2 As String = extendedAscii.GetString(extendedAsciiBytes) console.WriteLine(str2) 'Output : â, ??î or ôu ni++$-!‼⁉4od;/';:)///1!@#$%^yz: 

这是一个代码工作的小提琴

根据需要replace编码,其余部分应保持不变。

我使用这个正则expression式来过滤掉文件名中的坏字符。

 Regex.Replace(directory, "[^a-zA-Z0-9\\:_\- ]", "") 

这应该是允许文件名的所有字符。