9

我在 asp.net C# 中有一个多语言应用程序。在这里,我必须创建一个 zip 文件并使用数据库中的一些项目来构造文件名。我从文件名中去掉了特殊字符。但是,如果语言是德语,例如我的修剪算法将删除一些德语字符,如元音变音。

有人可以为我提供一种语言适应性修剪算法。

这是我的代码:

private string RemoveSpecialCharacters(string str)
{
    return str;
    StringBuilder sb = new StringBuilder();
    foreach (char c in str)
    {
        if ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') | c == '.' || c == '_' || c == ' ' || c == '+')
        {
            sb.Append(c);
        }
    }
    return sb.ToString();
}

谢谢

4

4 回答 4

5
string s = "abcöü*/";
var newstr = new String( s.Where(Char.IsLetterOrDigit).ToArray() );
于 2012-07-14T13:57:11.667 回答
5

假设您指的是 ZIP 文件的名称,而不是 ZIP 文件中的名称,您可能想要检查该字符是否对文件名有效,这将允许您使用的不仅仅是字母或数字:

char[] invalid = System.IO.Path.GetInvalidFileNameChars();

string s = "abcöü*/";
var newstr = new String(s.Where(c => !invalid.Contains(c)).ToArray()); 
于 2012-07-14T20:45:39.987 回答
4

一个更通用的变体可以减少字符串的损坏:

public static string RemoveDiacritics(this string s)
{
    // split accented characters into surrogate pairs
    IEnumerable<char> chars = s.Normalize(NormalizationForm.FormD);
    // remove all non-ASCII characters – i.e. the accents
    return new string(chars.Where(c => c < 0x7f && !char.IsControl(c)).ToArray());
}

这应该会删除大多数有问题的字符,同时仍保留大部分文本。(如果您正在创建文件名,您可能还想用空格字符替换换行符和制表符。)

于 2012-07-14T20:56:35.483 回答
1

单行,假设不可打印的 ASCII 基本上都是空格前的字符:

var safeString = new string(str.Select(c=>c<' '?'_':c).ToArray());
于 2013-02-15T14:01:17.323 回答