it-swarm.com.de

Wie können Sie Nicht-ASCII-Zeichen aus einer Zeichenfolge entfernen? (in C #)

Wie können Sie Nicht-ASCII-Zeichen aus einer Zeichenfolge entfernen? (in C #)

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

Hier ist eine reine .NET-Lösung, die keine regulären Ausdrücke verwendet:

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

Es mag schwerfällig aussehen, sollte aber intuitiv sein. Es verwendet die .NET-Codierung ASCII zur Konvertierung eines Strings. UTF8 wird während der Konvertierung verwendet, da es alle Originalzeichen darstellen kann. Es verwendet EncoderReplacementFallback, um alle Nicht-ASCII-Zeichen in zu konvertieren eine leere Zeichenfolge.

113
bzlm

Ich glaube, MonsCamus meinte:

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

Wenn Sie nicht streifen, sondern lateinische Akzente in nicht akzentuierte Zeichen umwandeln möchten, sehen Sie sich diese Frage an: Wie übersetze ich 8-Bit-Zeichen in 7-Bit-Zeichen? (D. H. Ü in

14
sinelaw

Inspiriert von Philcruz 'Lösung für reguläre Ausdrücke habe ich eine reine LINQ-Lösung erstellt

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

Dies ist ungetesteter Code.

9
Bent Rasmussen

keine Notwendigkeit für Regex. benutze einfach die Kodierung ...

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

Ich fand den folgenden leicht geänderten Bereich nützlich, um Kommentarblöcke aus einer Datenbank zu analysieren. Dies bedeutet, dass Sie sich nicht mit Tabulator- und Escape-Zeichen herumschlagen müssen, wodurch ein CSV-Feld verärgert würde.

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

Wenn Sie andere Sonderzeichen oder bestimmte Interpunktionszeichen vermeiden möchten, überprüfen Sie die ASCII-Tabelle

4
MonsCamus

Ich bin auf der Suche nach einer Lösung für erweiterte ASCII-Zeichen hierher gekommen, konnte sie aber nicht finden. Das nächste, was ich gefunden habe, ist bzlms Lösung . Aber das funktioniert nur für ASCII Code bis 127. (Natürlich können Sie den Codierungstyp in seinem Code ersetzen, aber ich denke, es war ein bisschen komplex zu verstehen. Daher diese Version zu teilen.) Hier ist ein Lösung, die für erweitert ASCII Codes, dh bis zu 255 funktioniert, das ist ISO 8859-1

Es findet und entfernt Nicht-ASCII-Zeichen (größer als 255)

Dim str1 as String= "â, ??î or ôu????� n☁i✑????++$-????♓!????????????‼⁉4⃣od;/⏬'®;????☕????:☝)????????///[email protected]#"

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;/';:)///[email protected]#$%^yz:

Hier ist ein funktionierendes Spiel für den Code

Ersetzen Sie die Codierung gemäß den Anforderungen, der Rest sollte gleich bleiben.

3

Dies ist in Bezug auf die Leistung nicht optimal, aber ein ziemlich direkter Linq-Ansatz:

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

Der Nachteil ist, dass alle "überlebenden" Zeichen zuerst in ein Array vom Typ char[], der dann weggeworfen wird, nachdem der Konstruktor string ihn nicht mehr verwendet.

2

Ich benutze diesen regulären Ausdruck, um ungültige Zeichen in einem Dateinamen herauszufiltern.

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

Das sollten alle Zeichen sein, die für Dateinamen zulässig sind.

1
user890332

Ich habe diesen regulären Ausdruck verwendet:

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