Как вы можете вырезать не-ASCII-символы из строки? (в С#)

Как вы можете вырезать не-ASCII-символы из строки? (в С#)

Ответ 1

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

Ответ 2

Вот чистое .NET-решение, которое не использует регулярные выражения:

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

Это может показаться громоздким, но оно должно быть интуитивным. Он использует кодировку .NET ASCII для преобразования строки. UTF8 используется во время преобразования, поскольку он может представлять любой из исходных символов. Он использует EncoderReplacementFallback для преобразования любого символа, отличного от ASCII, в пустую строку.

Ответ 3

Я считаю, что MonsCamus означал:

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

Ответ 5

Вдохновленный philcruz Regular Expression solution, я сделал чистое решение 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();
    }

Это непроверенный код.

Ответ 6

нет необходимости в регулярном выражении. просто используйте кодировку...

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

Ответ 7

Я нашел следующий слегка измененный диапазон, полезный для разбора блоков комментариев из базы данных, это означает, что вам не придется бороться с символами табуляции и escape-кода, что может привести к расстройству поля CSV.

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

Если вы хотите избежать других специальных символов или определенной пунктуации, отметьте таблицу ascii

Ответ 8

Это не оптимальный по производительности, но довольно простой подход Linq:

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

Недостатком является то, что все "выживающие" символы сначала помещаются в массив типа char[], который затем отбрасывается после того, как конструктор string больше не использует его.

Ответ 9

Я пришел сюда, чтобы найти решение для расширенных символов ascii, но не смог найти его. Самое близкое, что я нашел, - это решение bzlm. Но это работает только для кода ASCII до 127 (очевидно, вы можете заменить тип кодировки в своем коде, но я думаю, что это было немного сложно понять. Следовательно, совместное использование этой версии). Здесь решение, которое работает для расширенных кодов ASCII, т.е. до 255, которое является ISO 8859-1

Он находит и вырезает символы не-ascii (больше 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:

Здесь рабочая скрипка для кода

Замените кодировку в соответствии с требованием, остальные должны оставаться неизменными.

Ответ 10

Я использовал это выражение регулярного выражения:

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

Ответ 11

Я использую это регулярное выражение для фильтрации плохих символов в имени файла.

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

Это должны быть все символы, разрешенные для имен файлов.