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

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

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-битные символы? (т. е. от U до U)

Вдохновленный решением Regular Expression от 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 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)); 

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

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

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

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

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

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

Я пришел сюда, чтобы найти решение для расширенных символов 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: 

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

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

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

  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\\:_\- ]", "") 

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

  • Escape Special Character в Regex
  • Простой способ создания C ++ memystream из (char *, size_t) без копирования данных?
  • Что нужно переопределить в структуре, чтобы обеспечить правильное функционирование равенства?
  • Установка объектов на Null / Nothing после использования в .NET.
  • Вывод строк unicode в консольном приложении Windows
  • Как читать цвет пикселя экрана
  • Гетерогенные контейнеры в C ++
  • Что гарантируется относительно размера указателя функции?
  • Как-то зарегистрировать мои classы в списке
  • Является ли RVO (Оптимизация возвращаемого значения) применимым ко всем объектам?
  • Программный способ получения всех доступных языков (в assemblyх спутников)
  • Давайте будем гением компьютера.