2012-07-14 26 views
9

Tengo una aplicación multilingüe en asp.net C#. Aquí tengo que crear un archivo zip y usar algunos elementos de la base de datos para construir el nombre del archivo. Elimino caracteres especiales del nombre del archivo. Sin embargo, si el idioma es alemán, por ejemplo, mi algoritmo de recorte eliminará algunos caracteres alemanes como Umlaut.Eliminar caracteres no imprimibles C# multilenguaje

Podría alguien proporcionarme un algoritmo de recorte adaptable al idioma.

Aquí está mi código:

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

gracias

+0

¿Podemos ver el código? –

+0

cadena privada RemoveSpecialCharacters (cadena str) { return str; StringBuilder sb = new StringBuilder(); foreach (char c en cadena) if ((c> = '0' && c <= '9') || (c> = 'A' && c <= 'Z') || (c > = 'a' && c <= 'z') | c == '.' || c == '_' || c == '' || c == '+') { sb.Append (do); } } return sb.ToString(); } – josephj1989

+0

Eso debería estar en la pregunta. Lo agregué por ti. Y no entiendo por qué devuelves inmediatamente la cadena original. –

Respuesta

5

Suponiendo que quiere decir el nombre del archivo ZIP, en lugar de los nombres dentro del archivo zip, es probable que desee comprobar si el el carácter es válido para un nombre de archivo, que le permitirá usar más que letras o dígitos:

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

string s = "abcöü*/"; 
var newstr = new String(s.Where(c => !invalid.Contains(c)).ToArray()); 
+0

Esto también debería permitirle al OP utilizar diéresis ya que son perfectamente válidas en los nombres de archivo, excepto que la pregunta establece que es lo que quieren eliminar. (Dicho esto, acepto que sigue siendo una buena idea verificar ese conjunto además del despojo). – millimoose

+0

@millimoose No podía decir si quería quitar diéresis, etc., o si se quejaba de que su versión era innecesaria. los eliminó (frase OPs "adaptable al idioma"). –

+0

Buen punto, podría estar proyectando mi caso de uso en cosas. – millimoose

5
string s = "abcöü*/"; 
var newstr = new String(s.Where(Char.IsLetterOrDigit).ToArray()); 
+0

Parece dulce. Supongo que también deberías manejar el caso si se eliminan todas las letras. – Holf

+0

@Holf Dejaré esa parte a OP –

+0

Quizás quiso decir: 'Where (c => char.IsLetterOrDigit (c))' –

4

A mo re variante versátil que va a destrozar la cadena es menos:

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

Esto debería eliminar los caracteres más problemáticos al mismo tiempo conservar la mayor parte del texto. (Si va a crear nombres de archivo, también puede ser que desee reemplazar los saltos de línea y las pestañas con el carácter de espacio.)

+0

Más precisamente, descompone los caracteres precompuestos, por lo que cuando quita los caracteres que no son ASCII, se queda con el carácter base. –

+0

@Mechanicalsnail: Exactamente. Es probable que se rompa cuando la carta base no sea ASCII también, pero ese no debería ser el caso (a menudo) para los idiomas de Europa Occidental. (Por ejemplo, no reemplazará la i turca sin puntos con una regular). – millimoose

1

de una sola línea, asumiendo ASCII donde no imprimible son esencialmente todos los caracteres antes de que el espacio:

var safeString = new string(str.Select(c=>c<' '?'_':c).ToArray()); 
Cuestiones relacionadas