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

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

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

мой вопрос:
Как я могу обнаружить и устранить эти скрытые символы, используя C#?

8 ответов


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

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

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

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

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

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

посмотреть таблица ASCII если вы хотите внести изменения. Помните, что это лишит каждого не-ASCII-символа.

чтобы проверить выше, вы можете создать строку, как это:

    string input = string.Empty;

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

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

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

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

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

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

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

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

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

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

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

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


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

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

где "?- изображает персонажа,которого вы хотите снять.

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


прошло некоторое время, но на это еще не ответили.

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


string output = новая строка (вход.Где(с => !пеструшка.IsControl (c)).Метод toArray()); Это, безусловно, решит проблему. У меня был непечатаемый заменяющий символ (ASCII 26) В строке, которая заставляла мое приложение ломаться, и эта строка кода удаляла символы