2013-03-06 21 views
15

Il mio problema:Rimozione di caratteri nascosti dalle stringhe

Ho un'applicazione .NET che invia newsletter via email. Quando le newsletter sono visualizzate in Outlook, Outlook visualizza un punto interrogativo al posto di un personaggio nascosto che non può riconoscere. Questi personaggi nascosti provengono da utenti finali che copiano e incollano html che costituisce la newsletter in un modulo e lo invia. Un C# trim() rimuove questi caratteri nascosti se si verificano alla fine o all'inizio della stringa. Quando la newsletter viene visualizzata in gmail, gmail fa un buon lavoro ignorandoli. Quando si incollano questi caratteri nascosti in un documento word e si attiva l'opzione "mostra segni di paragrafo e simboli nascosti", i simboli appaiono come un rettangolo all'interno di un rettangolo più grande. Anche il testo che compone la newsletter può essere in qualsiasi lingua, quindi accettare i caratteri Unicode è obbligatorio. Ho provato ad andare in loop attraverso la stringa per rilevare il personaggio ma il loop non lo riconosce e lo passa sopra. Chiedendo anche all'utente finale di incollare l'html nel blocco note prima di inviarlo è fuori questione.

La mia domanda:
Come posso rilevare ed eliminare questi caratteri nascosti usando C#?

+0

Mettere un esempio qui .. –

+0

Esempio valori non validi sarebbe simpatico. Sto indovinando le sue stringhe Unicode in testo ascii, ma di nuovo questo è solo un tentativo. –

+0

regex, consente solo lettere numeri –

risposta

42

È possibile rimuovere tutti i caratteri di controllo dalla stringa di input con qualcosa di simile:

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

Here is the documentation per il metodo IsControl().

Oppure, se si vuole mantenere lettere e cifre solo, è anche possibile utilizzare il IsLetter e IsDigit funzione:

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

Grazie, ci proverò. Proverò a codificarlo e immediatamente a decodificarlo per vedere se il carattere nascosto viene rimosso. – bradley4

+0

HtmlEncode/Decode non rimuove alcun carattere, non è sicuro di come si consiglia di utilizzarlo. –

+0

@AlexeiLevenkov Sì, scusa, ho letto male la domanda ... aggiornerò la mia risposta di conseguenza. –

1

Se si conosce ciò che questi personaggi sono è possibile utilizzare string.Replace:

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

dove "?" rappresenta il personaggio che vuoi spogliare.

Lo svantaggio di questo approccio è che è necessario effettuare questa chiamata ripetutamente se vi sono più caratteri che si desidera rimuovere.

+0

Grazie, ma non posso usare questo approccio perché non so cosa sia il carattere nascosto. Appare solo in Outlook come un punto interrogativo. – bradley4

+1

+1. @ bradley4, se non sai cosa rimuovere (o cosa tenere) come ti aspetti che le persone rispondano alla tua domanda? –

3

Si può fare questo:

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

Grazie, ma non posso usare questo approccio perché non so quale sia il carattere nascosto. Appare solo in Outlook come un punto interrogativo. – bradley4

0

E 'stato un po', ma questo non è stato ancora risposto

Come si include il contenuto HMTL nel codice di invio? se lo stai leggendo dal file, controlla la codifica del file. Se si utilizza UTF-8 con firma (il nome varia leggermente tra gli editor), ciò potrebbe causare il carattere strano all'inizio della posta.

12

Di solito uso questa espressione regolare per sostituire tutti i caratteri non stampabili.

A proposito, la maggior parte della gente pensa che tab, avanzamento riga e ritorno a capo siano caratteri non stampabili, ma per me non lo sono.

ecco l'espressione:

string output = Regex.Replace(input, @"[^\u0009\u000A\u000D\u0020-\u007E]", "*"); 
  • ^ significa che se si tratta di uno dei seguenti:
  • \u0009 è scheda
  • \u000A è avanzamento riga
  • \u000D è di ritorno a capo
  • \u0020-\u007E significa tutto da spa ce a ~ - cioè, tutto in ASCII.

Vedere ASCII table se si desidera apportare modifiche. Ricorda che eliminerebbe ogni carattere non ASCII.

Per prova di cui sopra è possibile creare una stringa da soli in questo modo:

string input = string.Empty; 

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

Penso che il primo^inverta il set, mentre l'altro^s non dovrebbe essere lì (escluderà^dall'output). – Matt

0

uscita stringa = nuova stringa (!. Input.Where (c => char.IsControl (c)) ToArray()) ; Questo risolverà sicuramente il problema. Ho avuto un characer non stampabile sostituto (ASCII 26) in una stringa che stava causando la mia app per rompere e questa riga di codice rimosso i caratteri

2

ciò che meglio ha funzionato per me è:

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

Dove I' m assicurandomi che il carattere sia una lettera o una cifra, in modo da non ignorare nessuna lettera non inglese, o se non è una lettera, controllo se si tratta di un carattere ascii maggiore o uguale a quello dello Spazio per essere sicuro di ignorarne alcuni caratteri di controllo, questo assicura che non ignori la punteggiatura.

Alcuni suggeriscono di utilizzare IsControl per verificare se il carattere non è stampabile o meno, ma che ad esempio ignora il segno Left-To-Right.

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

IsControl non trova alcuni caratteri di controllo come da sinistra a destra contrassegno (LRM) (il char che nasconde comunemente in una stringa, mentre facendo copia incolla). Se si è certi che la stringa ha solo cifre e numeri, è possibile utilizzare IsLetterOrDigit

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

Se la stringa ha caratteri speciali, quindi

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

Sfortunatamente, dal mio test di unità, l'ultimo suggerimento ('nuova stringa (input.Where (c => c <128) .ToArray())') eliminerà anche i caratteri accentati. Ad esempio, "Siñalizacíon" diventerà "Sializacon". –

Problemi correlati