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

时间:2020-03-06 14:37:21  来源:igfitidea点击:

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

解决方案

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

这是一个不使用正则表达式的纯.NET解决方案:

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编码来转换字符串。转换期间使用UTF8,因为它可以表示任何原始字符。它使用EncoderReplacementFallback将任何非ASCII字符转换为空字符串。

受philcruz正则表达式解决方案的启发,我制作了一个纯LINQ解决方案

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();
    }

这是未经测试的代码。