Как удалить из строки символы, отличные от ASCII?(на С#)

StackOverflow https://stackoverflow.com/questions/123336

  •  02-07-2019
  •  | 
  •  

Вопрос

Как удалить из строки символы, отличные от ASCII?(на С#)

Это было полезно?

Решение

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

Другие советы

Вот чистое решение .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, в пустую строку.

Я считаю, что MonsCamus имел в виду:

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

Если вы хотите не удалять, а фактически преобразовать символы с латинским акцентом в символы без акцента, взгляните на этот вопрос: Как перевести 8-битные символы в 7-битные символы?(т.е.от О до У)

Вдохновлен Решение регулярных выражений Филкруза, я сделал чистое решение 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();
}

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

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

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

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

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

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

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

Он находит и удаляет символы, отличные от ascii (более 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:

Вот рабочая скрипка для кода

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top