43

私の問題:

ニュースレターをメールで送信する.NETアプリケーションがあります。ニュースレターをOutlookで表示すると、Outlookは、認識できない非表示の文字の代わりに疑問符を表示します。これらの非表示の文字は、ニュースレターを構成するhtmlをコピーしてフォームに貼り付けて送信するエンドユーザーからのものです。c#trim()は、これらの非表示の文字が文字列の最後または最初にある場合、それらを削除します。ニュースレターをGmailで表示すると、Gmailはそれらを無視して適切に機能します。これらの非表示の文字を単語ドキュメントに貼り付けて、「段落マークと非表示の記号を表示する」オプションをオンにすると、記号は大きな長方形の中に1つの長方形として表示されます。また、ニュースレターを構成するテキストは任意の言語にすることができるため、Unicode文字を受け入れる必要があります。私' 文字列をループして文字を検出しようとしましたが、ループは文字列を認識せず、文字列を通過します。また、送信する前に最初にhtmlをメモ帳に貼り付けるようにエンドユーザーに依頼することは問題外です。

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

4

8 に答える 8

93

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

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

IsControl()メソッドのドキュメントはこちらです

または、文字と数字のみを保持したい場合は、IsLetterandIsDigit関数も使用できます。

string output = new string(input.Where(c => char.IsLetter(c) || char.IsDigit(c)).ToArray());
于 2013-03-06T22:27:21.190 に答える
28

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

ところで、タブや改行、改行などは印刷できない文字だと思っている人が多いのですが、私はそうではありません。

したがって、ここに式があります:

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);
    }
于 2014-02-17T05:27:25.110 に答える
7

私にとって最も効果的なのは次のとおりです。

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

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

文字が印刷できないかどうかを確認するために IsControl を使用することを提案する人もいますが、たとえば左から右へのマークは無視されます。

于 2016-11-30T12:30:32.823 に答える
7
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())
于 2017-03-15T00:27:46.727 に答える
4

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

var hChars = new char[] {...};
var result = new string(yourString.Where(c => !hChars.Contains(c)).ToArray());
于 2013-03-06T22:27:52.473 に答える
0

この迅速で汚いワンライナーを使用して、壊れた Windows 10 電卓アプリによって残された LTR/RTL マークからの入力をクリーンアップしました。おそらく完璧にはほど遠いですが、簡単に修正するには十分です。

string cleaned = new string(input.Where(c => !char.IsControl(c) && (char.IsLetterOrDigit(c) || char.IsPunctuation(c) || char.IsSeparator(c) || char.IsSymbol(c) || char.IsWhiteSpace(c))).ToArray());
于 2020-07-17T21:43:29.920 に答える
-2
string output = new string(input.Where(c => !char.IsControl(c)).ToArray());

これで問題は確実に解決します。文字列に印刷できない代替文字 (ASCII 26) が含まれていたため、アプリが壊れていましたが、このコード行で文字が削除されました

于 2016-09-29T15:56:56.923 に答える