Intereting Posts

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

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

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

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

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

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 – вкладка
  • \u000A – перевод строки
  • \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, который больше или равен Space, чтобы убедиться Я игнорирую некоторые управляющие символы, это гарантирует, что я не игнорирую пунктуацию.

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

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

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

где “?” представляет персонажа, которого вы хотите вырезать.

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

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

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

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