0

我想替换上传到我的应用程序的文件名中的一些无效字符。

我在互联网上搜索了一些东西,发现了一些复杂的算法来做到这一点,这里有一个:

        public static string RemoverAcentuacao(string palavra)
        {
            string palavraSemAcento = null;
            string caracterComAcento = "áàãâäéèêëíìîïóòõôöúùûüçáàãâÄéèêëíìîïóòõÖôúùûÜç, ?&:/!;ºª%‘’()\"”“";
            string caracterSemAcento = "aaaaaeeeeiiiiooooouuuucAAAAAEEEEIIIIOOOOOUUUUC___________________";

            if (!String.IsNullOrEmpty(palavra))
            {
                for (int i = 0; i < palavra.Length; i++)
                {
                    if (caracterComAcento.IndexOf(Convert.ToChar(palavra.Substring(i, 1))) >= 0)
                    {
                        int car = caracterComAcento.IndexOf(Convert.ToChar(palavra.Substring(i, 1)));
                        palavraSemAcento += caracterSemAcento.Substring(car, 1);
                    }
                    else
                    {
                        palavraSemAcento += palavra.Substring(i, 1);
                    }
                }

                string[] cEspeciais = { "#39", "---", "--", "'", "#", "\r\n", "\n", "\r" };

                for (int q = 0; q < cEspeciais.Length; q++)
                {
                    palavraSemAcento = palavraSemAcento.Replace(cEspeciais[q], "-");
                }

                for (int x = (cEspeciais.Length - 1); x > -1; x--)
                {
                    palavraSemAcento = palavraSemAcento.Replace(cEspeciais[x], "-");
                }

                palavraSemAcento = palavraSemAcento.Replace("+", "-").Replace(Environment.NewLine, "").TrimStart('-').TrimEnd('-').Replace("<i>", "-").Replace("<-i>", "-").Replace("<br>", "").Replace("--", "-");
            }
            else
            {
                palavraSemAcento = "indefinido";
            }

            return palavraSemAcento.ToLower();
        }

有一种方法可以用不太复杂的算法来做到这一点吗?

我认为这个算法对于不太复杂的东西来说是非常复杂的,但我无法想到与此不同的东西。

4

4 回答 4

1

我想替换文件名中的一些无效字符

如果这真的是你想要的,那么这很容易

string ToLegalFileName(string s)
{
    var invalidChars = new HashSet<char>(Path.GetInvalidFileNameChars());
    return String.Join("", s.Select(c => invalidChars.Contains(c) ? '_' : c));
}

如果您的意图是用它们的 ascii 对应物替换重音字符,那么

string RemoverAcentuacao(string s)
{
    return String.Join("",
            s.Normalize(NormalizationForm.FormD)
            .Where(c => char.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark));
}

这是第 3 个版本,它用 '_' 替换重音字符 + 其他字符

string RemoverAcentuacao2(string s)
{
    return String.Join("",
            s.Normalize(NormalizationForm.FormD)
            .Where(c => char.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark)
            .Select(c => char.IsLetterOrDigit(c) ? c : '_')
            .Select(c => (int)c < 128 ? c : '_'));
}
于 2013-08-14T19:31:12.167 回答
0

使用正则表达式的解决方案:

string ReplaceSpecial(string input, string replace, char replacewith)
{
    char[] back = input.ToCharArray();
    var matches = Regex.Matches(String.Format("[{0}]", replace), input);
    foreach (var i in matches)
        back[i.Index] = replacewith;
    return new string(back);
}

使用 String.Replace 的更简单的解决方案:

string ReplaceSpecial(string input, char[] replace, char replacewith)
{
    string back = input;
    foreach (char i in replace)
        back.Replace(i, replacewith);
    return back;
}
于 2013-08-14T19:26:21.350 回答
0
static string RemoverAcentuacao(string s)
{            
        string caracterComAcento = "áàãâäéèêëíìîïóòõôöúùûüçáàãâÄéèêëíìîïóòõÖôúùûÜç, ?&:/!;ºª%‘’()\"”“";
        string caracterSemAcento = "aaaaaeeeeiiiiooooouuuucAAAAAEEEEIIIIOOOOOUUUUC___________________";
        return new String(s.Select(c =>
        {
            int i = caracterComAcento.IndexOf(c);
            return (i == -1) ? c : caracterSemAcento[i];
        }).ToArray());
}
于 2013-08-14T19:40:05.867 回答
-1

这是我最近使用的一个非常简单的方法。

我希望它符合你的要求。老实说,由于变量声明的语言,代码有点难以阅读。

    List<char> InvalidCharacters = new List<char>() { 'a','b','c' };        

    static string StripInvalidCharactersFromField(string field)
    {
        for (int i = 0; i < field.Length; i++)
        {
            string s = new string(new char[] { field[i] });
            if (InvalidCharacters.Contains(s))
            {
                field = field.Remove(i, 1);
                i--;
            }
        }

        return field;
    }
于 2013-08-14T19:10:25.353 回答