如何从字符串中剥离非ascii字符?(c#)


当前回答

如果你想要一个只有ISO-8859-1字符并且排除非标准字符的字符串,你应该使用这个表达式:

var result = Regex.Replace(value, @"[^\u0020-\u007E\u00A0-\u00FF]+", string.Empty);

注意:使用Encoding.GetEncoding("ISO-8859-1")方法将不能完成这项工作,因为未定义的字符不会被排除在外。

.Net小提琴样本

维基百科ISO-8859-1代码页获取更多详细信息。

其他回答

如果你不想剥离,而是真正地将拉丁重音字符转换为非重音字符,看看这个问题:我如何将8位字符转换为7位字符?(即Ü到U)

我相信MonsCamus的意思是:

parsememo = Regex.Replace(parsememo, @"[^\u0020-\u007E]", string.Empty);
public string ReturnCleanASCII(string s)
    {
        StringBuilder sb = new StringBuilder(s.Length);
        foreach (char c in s)
        {
            if ((int)c > 127) // you probably don't want 127 either
                continue;
            if ((int)c < 32)  // I bet you don't want control characters 
                continue;
            if (c == '%')
                continue;
            if (c == '?')
                continue;
            sb.Append(c);
        }
        return sb.ToString();
    }

这并不是最优的性能,而是一种非常直接的Linq方法:

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

缺点是,所有“幸存的”字符首先被放入char[]类型的数组中,然后在字符串构造函数不再使用它后将其丢弃。

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

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

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