wake-up-neo.com

Ausgeblendete Zeichen aus Strings entfernen

Mein Problem: 

Ich habe eine .NET-Anwendung, die Newsletter per E-Mail versendet. Wenn die Newsletter in Outlook angezeigt werden, zeigt Outlook ein Fragezeichen anstelle eines ausgeblendeten Zeichens an, das es nicht erkennt. Diese verborgenen Zeichen stammen von Endbenutzern, die HTML-Dateien kopieren und einfügen, aus denen der Newsletter besteht, und diese in ein Formular einreichen. A c # trim () entfernt diese versteckten Zeichen, wenn sie am Ende oder Anfang der Zeichenfolge auftreten. Wenn der Newsletter in Google Mail angezeigt wird, kann Google Mail diese ignorieren. Wenn Sie diese ausgeblendeten Zeichen in ein Word-Dokument einfügen und die Option "Absatzmarken und ausgeblendete Symbole anzeigen" aktivieren, werden die Symbole als ein Rechteck innerhalb eines größeren Rechtecks ​​angezeigt. Auch der Text, aus dem die Newsletter bestehen, kann in jeder Sprache verfasst sein, daher ist das Akzeptieren von Unicode-Zeichen ein Muss. Ich habe versucht, den String zu durchlaufen, um das Zeichen zu erkennen, aber die Schleife erkennt es nicht und geht darüber hinweg. Bitten Sie den Endbenutzer auch, die HTML-Datei zuerst in den Notizblock einzufügen, bevor Sie ihn abschicken. Dies steht außer Frage. 

Meine Frage:
Wie kann ich diese versteckten Zeichen mit C # erkennen und entfernen? 

19
bradley4

Sie können alle Steuerzeichen aus Ihrer Eingabezeichenfolge entfernen.

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

Hier ist die Dokumentation für die IsControl() Methode.

Wenn Sie nur Buchstaben und Ziffern beibehalten möchten, können Sie auch die Funktion IsLetter und IsDigit verwenden:

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

Normalerweise verwende ich diesen regulären Ausdruck, um alle nicht druckbaren Zeichen zu ersetzen.

Die meisten Leute meinen übrigens, dass Tabulator, Zeilenvorschub und Wagenrücklauf nicht druckbare Zeichen sind, für mich aber nicht. 

Also hier ist der Ausdruck:

string output = Regex.Replace(input, @"[^\u0009\u000A\u000D\u0020-\u007E]", "*");
  • ^ bedeutet, dass es sich um Folgendes handelt:
  • \u0009 ist tab 
  • \u000A ist ein Zeilenvorschub
  • \u000D ist Wagenrücklauf
  • \u0020-\u007E bedeutet alles von Leerzeichen bis ~ - also alles in ASCII.

Siehe ASCII - Tabelle , wenn Sie Änderungen vornehmen möchten. Denken Sie daran, dass dadurch jedes Nicht-ASCII-Zeichen entfernt würde. 

Um oben zu testen, können Sie eine Zeichenfolge wie folgt selbst erstellen:

    string input = string.Empty;

    for (int i = 0; i < 255; i++)
    {
        input += (char)(i);
    }
16
Mubashar Ahmad
new string(input.Where(c => !char.IsControl(c)).ToArray());

IsControl vermisst einige Steuerzeichen wie die Links-nach-Rechts-Markierung (LRM) (das Zeichen, das beim Kopieren/Einfügen normalerweise in einer Zeichenfolge verborgen wird). Wenn Sie sicher sind, dass Ihre Zeichenfolge nur Ziffern und Zahlen enthält, können Sie IsLetterOrDigit verwenden

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

Wenn Ihre Zeichenfolge Sonderzeichen enthält, dann

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

Was für mich am besten funktioniert hat:

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

Dabei vergewissere ich mich, dass es sich bei dem Zeichen um einen Buchstaben oder eine Ziffer handelt, sodass ich keine nicht englischen Buchstaben ignorieren kann. Wenn es sich nicht um einen Buchstaben handelt, überprüfe ich, ob es sich um ein ASCII-Zeichen handelt, das größer oder gleich dem Leerzeichen ist Ich ignoriere einige Steuerzeichen, damit ich die Interpunktion nicht ignoriere.

In einigen Fällen wird die Verwendung von IsControl empfohlen, um zu prüfen, ob das Zeichen nicht druckbar ist oder nicht, dies jedoch beispielsweise die Markierung von links nach rechts ignoriert. 

3
Igor Meszaros

Du kannst das:

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

Wenn Sie wissen, was diese Zeichen sind, können Sie string.Replace verwenden:

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

woher "?" steht für das Zeichen, das Sie entfernen möchten.

Der Nachteil bei diesem Ansatz ist, dass Sie diesen Aufruf wiederholt durchführen müssen, wenn mehrere Zeichen entfernt werden sollen.

1
ChrisF

Es ist eine Weile her, aber das wurde noch nicht beantwortet. 

Wie fügen Sie den HMTL-Inhalt in den Sendecode ein? Wenn Sie es aus einer Datei lesen, überprüfen Sie die Dateikodierung. Wenn Sie UTF-8 mit Signatur verwenden (der Name variiert zwischen den Editoren), kann dies zu Beginn der E-Mail zu einem merkwürdigen Zeichen führen.

0
SimSimY

zeichenfolgenausgabe = Neue Zeichenfolge (Eingabe.Wo (c =>! Char.IsControl (c)). ToArray ()); Dies wird das Problem sicher lösen. Ich hatte einen nicht druckbaren Zeichenersatz (ASCII 26) in einer Zeichenfolge, was dazu führte, dass meine App brach und diese Codezeile die Zeichen entfernte

0
Niraj Kheria