Jak można usunąć znaki spoza ASCII z łańcucha znaków? (w C#)

Jak można usunąć znaki spoza ASCII z ciągu znaków? (w C#)

 192
Author: bzlm, 2008-09-23

11 answers

string s = "søme string";
s = Regex.Replace(s, @"[^\u0000-\u007F]+", string.Empty);
 367
Author: philcruz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-18 03:51:59

Oto czyste rozwiązanie. NET, które nie używa wyrażeń regularnych:

        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)
            )
        );
Może to wydawać się kłopotliwe, ale powinno być intuicyjne. Używa kodowania. NET ASCII do konwersji ciągu znaków. UTF8 jest używany podczas konwersji, ponieważ może reprezentować dowolny z oryginalnych znaków. Używa EncoderReplacementFallback to, aby przekonwertować dowolny znak spoza ASCII na pusty łańcuch.
 103
Author: bzlm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-25 20:05:22

Myślę, że MonsCamus miał na myśli:

parsememo = Regex.Replace(parsememo, @"[^\u0020-\u007E]", string.Empty);
 28
Author: Josh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-25 20:46:26

Jeśli chcesz nie rozbierać, ale konwertować łacińskie znaki akcentowane na znaki nieakcentowane, spójrz na to pytanie: Jak przetłumaczyć 8-bitowe znaki na 7-bitowe znaki? (tj. Ü do U)

 14
Author: sinelaw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:23

Zainspirowany rozwiązaniem wyrażenia regularnego philcruza , stworzyłem czyste rozwiązanie LINQ

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

To jest nieprzetestowany kod.

 9
Author: Bent Rasmussen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:40

Nie ma potrzeby stosowania regex. wystarczy użyć kodowania...

sOutput = System.Text.Encoding.ASCII.GetString(System.Text.Encoding.ASCII.GetBytes(sInput));
 5
Author: rjp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-18 17:56:45

Znalazłem następujący nieco zmieniony zakres przydatny do parsowania bloków komentarzy z bazy danych, oznacza to, że nie będziesz musiał zmagać się ze znakami tab i escape, które spowodowałyby zdenerwowanie pola CSV.

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

Jeśli chcesz uniknąć innych znaków specjalnych lub konkretnych znaków interpunkcyjnych, sprawdź tabelę ascii

 4
Author: MonsCamus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-01 10:02:56

Nie jest to optymalne pod względem wydajności, ale dość proste podejście Linq: {]}

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

Minusem jest to, że wszystkie "ocalałe" znaki są najpierw umieszczane w tablicy typu char[], która jest następnie wyrzucana po tym, jak konstruktor string już jej nie używa.

 2
Author: Jeppe Stig Nielsen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-03 17:08:42

Przyszedłem tu szukać rozwiązania dla rozszerzonych znaków ascii, ale nie mogłem go znaleźć. Najbliżej znalazłem rozwiązanie bzlm . Ale to działa tylko dla kodu ASCII do 127 (oczywiście można zastąpić typ kodowania w jego kodzie, ale myślę, że było to trochę skomplikowane do zrozumienia. Stąd dzielenie się tą wersją). Oto rozwiązanie, które działa dla rozszerzonych kodów ASCII tj. do 255 czyli ISO 8859-1

Znajduje i usuwa znaki spoza ascii(większe niż 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:

Oto praca nad kodem

Zastąp kodowanie zgodnie z wymogiem, reszta powinna pozostać taka sama.

 2
Author: TheUknown,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:23

Użyłem wyrażenia regex:

    string s = "søme string";
    Regex regex = new Regex(@"[^a-zA-Z0-9\s]", (RegexOptions)0);
    return regex.Replace(s, "");
 1
Author: Anonymous coward,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-12 12:27:20

Używam tego wyrażenia regularnego do filtrowania złych znaków w nazwie pliku.

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

To powinny być wszystkie znaki dozwolone dla nazw plików.

 0
Author: user890332,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-09 18:17:02