Domanda

Come si possono eliminare caratteri non ASCII da una stringa? (in C #)

È stato utile?

Soluzione

string s = "søme string";
s = Regex.Replace(s, @"[^\u0000-\u007F]+", string.Empty);

Altri suggerimenti

Ecco una soluzione .NET pura che non utilizza espressioni regolari:

string inputString = "Räksmörgås";
string asAscii = Encoding.ASCII.GetString(
    Encoding.Convert(
        Encoding.UTF8,
        Encoding.GetEncoding(
            Encoding.ASCII.EncodingName,
            new EncoderReplacementFallback(string.Empty),
            new DecoderExceptionFallback()
            ),
        Encoding.UTF8.GetBytes(inputString)
    )
);

Può sembrare ingombrante, ma dovrebbe essere intuitivo. Utilizza la codifica ASCII .NET per convertire una stringa. UTF8 viene utilizzato durante la conversione perché può rappresentare uno qualsiasi dei caratteri originali. Utilizza un EncoderReplacementFallback per convertire qualsiasi carattere non ASCII in una stringa vuota.

Credo che MonsCamus intendesse:

parsememo = Regex.Replace(parsememo, @"[^\u0020-\u007E]", string.Empty);

Se non si desidera eseguire lo striping, ma per convertire effettivamente caratteri accentati latini in caratteri non accentati, dare un'occhiata a questa domanda: Come traduco i caratteri a 8 bit in caratteri a 7 bit? (ovvero da & # 220; a U)

Ispirato da la soluzione di espressione regolare di Philcruz , ho creato una soluzione LINQ pura

public static string PureAscii(this string source, char nil = ' ')
{
    var min = '\u0000';
    var max = '\u007F';
    return source.Select(c => c < min ? nil : c > max ? nil : c).ToText();
}

public static string ToText(this IEnumerable<char> source)
{
    var buffer = new StringBuilder();
    foreach (var c in source)
        buffer.Append(c);
    return buffer.ToString();
}

Questo è un codice non testato.

non c'è bisogno di regex. usa solo la codifica ...

sOutput = System.Text.Encoding.ASCII.GetString(System.Text.Encoding.ASCII.GetBytes(sInput));

Ho trovato utile il seguente intervallo leggermente modificato per analizzare i blocchi di commenti fuori da un database, questo significa che non dovrete fare i conti con i caratteri tab e escape che potrebbero far arrabbiare un campo CSV.

parsememo = Regex.Replace(parsememo, @"[^\u001F-\u007F]", string.Empty);

Se vuoi evitare altri caratteri speciali o punteggiatura particolare, controlla la tabella ascii

Sono venuto qui alla ricerca di una soluzione per caratteri ASCII estesi, ma non sono riuscito a trovarlo. Il più vicino che ho trovato è soluzione di bzlm . Ma questo funziona solo per il codice ASCII fino a 127 (ovviamente puoi sostituire il tipo di codifica nel suo codice, ma penso che sia stato un po 'complesso da capire. Quindi, condividere questa versione). Ecco una soluzione che funziona per codici ASCII estesi cioè fino a 255 che è il ISO 8859-1

Trova e rimuove caratteri non ascii (maggiori di 255)

Dim str1 as String= "â, ??î or ôu🕧� n☁i✑💴++$-💯♓!🇪🚑🌚‼⁉4⃣od;/⏬'®;😁☕😁:☝)😁😁///😍1!@#"

Dim extendedAscii As Encoding = Encoding.GetEncoding("ISO-8859-1", 
                                                New EncoderReplacementFallback(String.empty),
                                                New DecoderReplacementFallback())

Dim extendedAsciiBytes() As Byte = extendedAscii.GetBytes(str1)

Dim str2 As String = extendedAscii.GetString(extendedAsciiBytes)

console.WriteLine(str2)
'Output : â, ??î or ôu ni++$-!‼⁉4od;/';:)///1!@#$%^yz:

Ecco un un violino funzionante per il codice

Sostituisci la codifica secondo il requisito, il resto dovrebbe rimanere lo stesso.

Non si tratta di prestazioni ottimali dal punto di vista delle prestazioni, ma di un approccio Linq piuttosto diretto:

string strippedString = new string(
    yourString.Where(c => c <= sbyte.MaxValue).ToArray()
    );

Il rovescio della medaglia è che tutto il "sopravvivere". i caratteri vengono prima inseriti in una matrice di tipo char [] che viene quindi eliminata dopo che il costruttore string non lo utilizza più.

Ho usato questa espressione regex:

    string s = "søme string";
    Regex regex = new Regex(@"[^a-zA-Z0-9\s]", (RegexOptions)0);
    return regex.Replace(s, "");

Uso questa espressione regolare per filtrare i caratteri errati in un nome file.

Regex.Replace(directory, "[^a-zA-Z0-9\\:_\- ]", "")

Dovrebbero essere tutti i caratteri consentiti per i nomi dei file.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top