2012-07-14 13 views
9

Mam wielojęzyczną aplikację w asp.net C#. Tutaj muszę utworzyć plik zip i użyć niektórych elementów z bazy danych, aby skonstruować nazwę pliku. Usuwam znaki specjalne z nazwy pliku. Jeśli jednak język jest niemiecki, na przykład mój algorytm przycinania usunie niektóre znaki niemieckie, takie jak Umlaut.Usuwanie znaków niedrukowalnych C# wielojęzyczny

Czy ktoś mógłby mi zapewnić algorytm dostosowujący język.

Oto mój kod:

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

dzięki

+0

Czy możemy zobaczyć kod? –

+0

prywatny ciąg RemoveSpecialCharacters (string str) { return str; StringBuilder sb = new StringBuilder(); foreach (znak c w str) { jeśli ((c> = '0' && c <= '9') || (c> = 'A' && c <= 'Z') || (c > = 'a' && c <= 'z') | c == '.' || c == '' '|| c ==' '|| c ==' + ') { sb.Append (do); } } } return sb.ToString(); } – josephj1989

+0

To powinno być pytanie. Dodałem to dla ciebie. I nie rozumiem, dlaczego natychmiast zwraca oryginalny ciąg. –

Odpowiedz

5

Zakładając, oznacza nazwę pliku ZIP, zamiast nazw w pliku ZIP, prawdopodobnie chcesz, aby sprawdzić, czy postać jest ważna dla nazwy pliku, który będzie można wykorzystać więcej niż tylko liter lub cyfr:

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

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

Powinno to pozwolić OPowi na użycie umlautów, ponieważ są one całkowicie poprawne w nazwach plików, z wyjątkiem tego, że pytanie jest tym, co oni chcą usunąć. (Niemniej zgadzam się, że to wciąż dobry pomysł, aby sprawdzić na tej tablicy oprócz stripping). – millimoose

+0

@millimoose nie mogę powiedzieć, czy chce się rozebrać się przegłosów, etc., czy też nie narzekał, że jego wersji niepotrzebnie usunięto je (wyrażenie OP "język przystosowalny"). –

+0

Dobra uwaga, mógłbym rzutować moje przypadki użycia na rzeczy. – millimoose

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

Wygląda słodko. Sądzę, że powinieneś także załatwić sprawę, jeśli wszystkie litery zostaną usunięte. – Holf

+0

@Holf Zostawię tę część do OP –

+0

Czy chodziło Ci o: 'Gdzie (c => char.IsLetterOrDigit (c))' –

4

MO Re wszechstronnego wariantu, który będzie magiel ciąg mniej znaczy:

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

Należy usunąć najbardziej problematycznych znaków przy jednoczesnym zachowaniu większości z tekstu. (Jeśli tworzenie nazw, można też chcą zastąpić newlines i kart z charakterem miejsca.)

+0

Dokładniej, rozkłada znaki poprzedzające kompozycję, więc gdy usuniesz znaki spoza ASCII, pozostaniesz z postacią podstawową. –

+0

@Mechanicalsnail: Dokładnie. Prawdopodobnie pęknie, gdy literą podstawową jest również nie ASCII, ale nie powinno tak być (często) dla języków zachodnioeuropejskich. (Np. To nie zastąpi tureckiej bez kropki i zwykłą.) – millimoose

1

One-liner, zakładając ASCII gdzie niedrukowalny są zasadniczo wszystkie znaki przed przestrzeni:

var safeString = new string(str.Select(c=>c<' '?'_':c).ToArray()); 
Powiązane problemy