2012-07-14 21 views
9

çıkarın. Burada bir zip dosyası oluşturmalı ve dosya ismini oluşturmak için veritabanından bazı öğeleri kullanmalıyım. Dosya adından özel karakterler çıkarıyorum. Ancak dil Almanca ise, örneğin benim kırpma algoritmam, Umlaut gibi bazı Alman karakterleri kaldıracaktır.ben asp.net C# bir dilli uygulamaya sahip olmayan yazdırılabilir karakterleri C# multilanguage

birisi bir dil uyarlanabilir kırpma algoritması ile beni verebilir misiniz. yerine ZIP dosyası içindeki isimleri, muhtemelen olmadığını kontrol etmek istiyorum, ZIP dosyasının adını anlamına varsayarsak

+0

Kodu görebilir miyiz? –

+0

özel dize RemoveSpecialCharacters (string str) { dönüş str; StringBuilder sb = new StringBuilder(); foreach (charc içinde str) { ((c> = '0' && c <= '9') || (c> = 'A' && c <= 'Z') || (c > = 'a' && c <= 'z') | c == || c == '_' || c == '' || c == '+') { sb.Append '' (c) } } dönüş sb.ToString(); } – josephj1989

+0

Sorunun içinde olması gerekir. Bunu senin için ekledim. Ve neden orijinal dizeyi hemen döndürdüğünü anlamıyorum. –

cevap

5

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

teşekkürler: Burada

benim kodudur karakter, yalnızca harf veya rakamdan daha fazlasını kullanmanıza izin veren bir dosya adı için geçerlidir:

+0

Bu ayrıca OP'nin, dosya adlarında mükemmel bir şekilde geçerli olduklarından umarımı kullanmasına izin vermeli, soruların dışında kaldırmak istedikleri durumlar dışında. (Ben hala sıyırma ek olarak bu diziye karşı kontrol etmek iyi bir fikirdir hemfikir söyledi.) O gereksiz onun sürümü şikayetçi olsaydı – millimoose

+0

@millimoose o vb umlauts atmak istiyorsa söyle, ya da olamazdı onları çıkardı (OPs ifadesi "dil uyarlanabilir"). –

+0

İyi bir nokta, kullanım durumumu şeylere yansıtıyor olabilirim. – millimoose

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

Tatlı görünüyor. Sanırım bütün harfler söküldüğünde davayı da halletmelisin. Bunu mu demek istediniz – Holf

+0

@Holf ben OP –

+0

için o kısmını bırakacağım: 'Nerede (c => char.IsLetterOrDigit (c))' –

4

A mo dize daha az bozar yönlü varyant yeniden geçerli: hala metnin en korurken

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

Bu en sorunlu karakterleri kaldırmalısınız. (Eğer dosya oluştururken, ayrıca boşluk karakteriyle yeni satır ve sekmeleri değiştirmek isteyebilirsiniz.)

+0

Daha kesin olarak, önceden oluşturulmuş karakterleri ayrıştırır, dolayısıyla ASCII olmayan karakterleri kestiğinizde, temel karakterle kalırsınız. –

+0

@Mechanicalsnail: Tam olarak. Temel mektup ASCII olmayan bir şekilde de olsa, ancak Batı Avrupa dilleri için geçerli olmamalıdır (muhtemelen). (E.g., türkçesiz i ile normal bir yer değiştirmez.) – millimoose

1

Tek astarı olmayan yazdırılabilir tüm karakter boşluk önce esasen varsayılarak ASCII:

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