Удаление скрытых символов из строк

Моя проблема:

У меня есть приложение .NET, которое отправляет информационные бюллетени по электронной почте. Когда информационные бюллетени просматриваются в Outlook, Outlook отображает знак вопроса вместо скрытого символа, который он не может распознать. Эти скрытые символы поступают от конечных пользователей, которые копируют и вставляют html, который составляет информационные бюллетени в форме и отправляет их. С# trim() удаляет эти скрытые символы, если они встречаются в конце или в начале строки. Когда бюллетень просматривается в gmail, gmail делает хорошую работу, игнорируя их. При вставке этих скрытых символов в документ Word и включении опции "показать абзацы и скрытые символы" символы отображаются как один прямоугольник внутри большего прямоугольника. Также текст, составляющий информационные бюллетени, может быть на любом языке, поэтому принятие символов Unicode является обязательным. Я пробовал прокручивать строку, чтобы обнаружить символ, но цикл не распознает и не передает его. Также попросите конечного пользователя вставить html в блокнот сначала перед отправкой, о чем не может быть и речи.

Мой вопрос:
Как я могу обнаружить и устранить эти скрытые символы с помощью С#?

Ответ 1

Вы можете удалить все управляющие символы из строки ввода с помощью следующего:

string input; // this is your input string
string output = new string(input.Where(c => !char.IsControl(c)).ToArray());

Вот документация для метода IsControl().

Или, если вы хотите сохранить только буквы и цифры, вы также можете использовать IsLetter и IsDigit:

string output = new string(input.Where(c => char.IsLetter(c) || char.IsDigit(c)).ToArray());

Ответ 2

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

Кстати, большинство людей думают, что вкладка, фид строки и возврат каретки являются непечатаемыми символами, но для меня это не так.

Итак, вот выражение:

string output = Regex.Replace(input, @"[^\u0009\u000A\u000D\u0020-\u007E]", "*");
  • ^ означает, что это одно из следующего:
  • \u0009 - вкладка
  • \u000A - перевод строки
  • \u000D - возврат каретки
  • \u0020-\u007E означает все из пространства в ~ - то есть все в ASCII.

Если вы хотите внести изменения, см. ASCII table. Помните, что он удалит все символы, отличные от ASCII.

Чтобы проверить выше, вы можете создать строку самостоятельно:

    string input = string.Empty;

    for (int i = 0; i < 255; i++)
    {
        input += (char)(i);
    }

Ответ 3

Вы можете сделать это:

var hChars = new char[] {...};
var result = new string(yourString.Where(c => !hChars.Contains(c)).ToArray());

Ответ 4

new string(input.Where(c => !char.IsControl(c)).ToArray());

IsControl пропускает некоторые управляющие символы, такие как знак слева направо (LRM) (char, который обычно скрывается в строке при копировании). Если вы уверены, что ваша строка имеет только цифры и цифры, вы можете использовать IsLetterOrDigit

new string(input.Where(c => char.IsLetterOrDigit(c)).ToArray())

Если ваша строка имеет специальные символы, то

new string(input.Where(c => c < 128).ToArray())

Ответ 5

Что лучше всего для меня работало:

string result = new string(value.Where(c =>  char.IsLetterOrDigit(c) || (c >= ' ' && c <= byte.MaxValue)).ToArray());

Где я уверен, что персонаж - любая буква или цифра, так что я не игнорирую какие-либо неанглийские буквы, или если это не письмо, я проверяю, является ли это символом ascii, который больше или равен пространству чтобы я игнорировал некоторые управляющие символы, это гарантирует, что я не игнорирую пунктуацию.

Некоторые предлагают использовать IsControl для проверки того, не является ли символ недоступным для печати или нет, но, например, игнорирует маркер слева направо.

Ответ 6

Если вы знаете, что эти символы, вы можете использовать string.Replace:

newString = oldString.Replace("?", "");

где "?" представляет символ, который вы хотите вырезать.

Недостатком этого подхода является то, что вам нужно сделать этот вызов несколько раз, если есть несколько символов, которые вы хотите удалить.

Ответ 7

Это было какое-то время, но на это еще не ответили.

Как вы включаете содержимое HMTL в код отправки? если вы читаете его из файла, проверьте кодировку файла. Если вы используете UTF-8 с подписью (имя немного меняется между редакторами), это может привести к странному char в начале письма.

Ответ 8

string output = new string (input.Where(c = > ! char.IsControl(c)). ToArray()); Это, безусловно, решит проблему. У меня был непечатаемый символ-заменитель (ASCII 26) в строке, которая вызывала нарушение моего приложения, и эта строка кода удаляла символы