Frage

Wie können Sie Nicht-ASCII-Zeichen aus einer Zeichenkette strippen? (In C #)

War es hilfreich?

Lösung

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

Andere Tipps

Hier ist eine reine .NET-Lösung, die keine regulären Ausdrücke nicht 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 kann aussehen umständlich, aber es sollte intuitiv sein. Es nutzt die .NET-ASCII-Codierung eine Zeichenfolge zu konvertieren. UTF8 wird bei der Konvertierung verwendet, weil es eine der ursprünglichen Zeichen darstellen kann. Es verwendet eine Encoder zu jeder Nicht-ASCII-Zeichen auf eine leere Zeichenfolge zu konvertieren.

Ich glaube, MonsCamus gemeint:

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

Wenn Sie nicht entfernen lassen möchten, sondern tatsächlich lateinische akzentuierte zu nicht-akzentuierte Zeichen umwandeln, werfen Sie einen Blick auf diese Frage: Wie ich 8bit Zeichen in 7-Bit-Zeichen übersetzen? (D U bis U)

Inspiriert von philcruz der Regular Expression Lösung , ich habe eine reine LINQ Lösung gemacht

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 nicht getestet Code.

keine Notwendigkeit für regex. verwenden nur Codierung ...

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

fand ich den folgenden leicht veränderten Bereich nützlich für die Analyse Kommentarblocks aus einer Datenbank, bedeutet dies, dass Sie müssen nicht mit Tab kämpfen und Escape-Zeichen, die eine CSV Feld führen würden verärgert werden.

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

Wenn Sie mögen, andere Sonderzeichen oder bestimmte Satzprüfung die ASCII-Tabelle vermeiden

Ich bin hergekommen, um eine Lösung für erweiterte ASCII-Zeichen suchen, aber konnte sie nicht finden. Die nächstgelegene ich fand, ist der href="https://stackoverflow.com/a/135473/2196341"> bzlm. Aber das funktioniert nur für ASCII-Code bis zu 127 (natürlich können Sie den Codierungstyp in seinem Code ersetzen, aber ich denke, es ist ein wenig komplex zu verstehen ist. Daher teilt diese Version). Hier ist eine Lösung, die bis zu 255 für erweiterten ASCII-Codes, dh Werke, die die ISO 8859-1

Es findet und Streifen aus Nicht-ASCII-Zeichen (mehr als 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:

Hier ist eine Arbeits Geige für den Code

Setzen Sie die Codierung nach der Anforderung, Rest soll gleich bleiben.

Dies ist nicht die optimale Leistung-weise, aber ein ziemlich geradlinig Linq Ansatz:

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

Der Nachteil ist, dass alle „überlebende“ Zeichen zunächst in ein Array vom Typ char[] gesetzt werden, die dann weggeworfen wird, nachdem der string Konstruktor nicht mehr verwendet wird.

Ich habe diesen regulären Ausdruck:

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

Ich benutze diesen regulären Ausdruck in einem Dateinamen schlechten Zeichen auszufiltern.

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

Das sollte alle Zeichen für Dateinamen erlaubt werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top