Как вы можете удалить не-ASCII символы из строки? (в C #) - PullRequest
204 голосов
/ 23 сентября 2008

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

Ответы [ 11 ]

385 голосов
/ 23 сентября 2008
string s = "søme string";
s = Regex.Replace(s, @"[^\u0000-\u007F]+", string.Empty);
110 голосов
/ 25 сентября 2008

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

35 голосов
/ 02 августа 2013

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

parsememo = Regex.Replace(parsememo, @"[^\u0020-\u007E]", string.Empty);
14 голосов
/ 06 апреля 2012

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

9 голосов
/ 27 января 2010

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

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

5 голосов
/ 18 июня 2013

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

sOutput = System.Text.Encoding.ASCII.GetString(System.Text.Encoding.ASCII.GetBytes(sInput));
4 голосов
/ 01 октября 2012

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

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

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

3 голосов
/ 12 октября 2016

Я пришел сюда в поисках решения для расширенных символов ascii, но не смог его найти. Самое близкое, что я нашел, - это решение bzlm . Но это работает только для кода ASCII до 127 (очевидно, вы можете заменить тип кодирования в его коде, но я думаю, что это было немного сложно понять. Следовательно, поделиться этой версией). Вот решение, которое работает для расширенных кодов ASCII, то есть до 255 , то есть ISO 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:

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

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

2 голосов
/ 03 сентября 2013

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

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

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

1 голос
/ 09 июня 2017

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...