web-dev-qa-db-ja.com

文字列内から非表示の文字を削除する

私の問題:

メールでニュースレターを送信する.NETアプリケーションがあります。 Outlookでニュースレターを表示すると、Outlookでは認識できない隠し文字の代わりに疑問符が表示されます。これらの非表示の文字は、ニュースレターを構成するhtmlをコピーしてフォームに貼り付けて送信するエンドユーザーから来ています。 c#trim()は、これらの非表示文字が文字列の末尾または先頭にある場合、それらを削除します。ニュースレターがGmailで表示されると、Gmailはそれらを無視して良い仕事をします。これらの非表示の文字をWord文書に貼り付けて「段落記号と非表示の記号を表示」オプションをオンにすると、記号は大きな長方形の中に1つの長方形として表示されます。また、ニュースレターを構成するテキストはどの言語でも使用できるため、Unicode文字を受け入れる必要があります。文字列をループして文字を検出しようとしましたが、ループはそれを認識せずに通過します。また、送信する前にHTMLをメモ帳に貼り付けるようにエンドユーザーに要求することは問題外です。

私の質問:
C#を使用してこれらの隠された文字を検出および削除するにはどうすればよいですか?

23
bradley4

次のような方法で、入力文字列からすべての制御文字を削除できます。

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

私は通常、この正規表現を使用して、印刷できないすべての文字を置き換えます。

ちなみに、ほとんどの人はタブ、ラインフィード、キャリッジリターンは印刷できない文字だと思っていますが、私にとってはそうではありません。

そのため、次の式があります。

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);
    }
19
Mubashar
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())
6
shanmuga raja

私にとって最もうまくいったのは:

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

文字が任意の文字または数字であることを確認しているため、英語以外の文字を無視しないようにします。または、文字でない場合は、スペースよりも大きいまたは等しいアスキー文字であるかどうかを確認します一部の制御文字を無視します。これにより、句読点を無視しなくなります。

IsControlを使用して、文字が印刷可能でないかどうかを確認することをお勧めしますが、たとえば、左から右へのマークは無視されます。

3
Igor Meszaros

あなたはこれを行うことができます:

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

しばらく経ちましたが、これはまだ回答されていません。

送信コードにHMTLコンテンツをどのように含めますか?ファイルから読み込む場合は、ファイルのエンコードを確認してください。署名付きのUTF-8を使用している場合(名前はエディターによってわずかに異なります)、これはメールの冒頭で奇妙な文字を引き起こす可能性があります。

0
SimSimY

これらの文字が何であるかがわかっている場合は、string.Replace

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

どこ "?"除去する文字を表します。

このアプローチの欠点は、削除したい複数の文字がある場合、この呼び出しを繰り返し行う必要があることです。

0
ChrisF

string output = new string(input.Where(c =>!char.IsControl(c))。ToArray());これで確実に問題が解決します。文字列に非印刷可能な代替文字(ASCII 26)が含まれていたため、アプリが破損し、このコード行で文字が削除されました

0
Niraj Kheria