c# - regulares - Eliminar caracteres ocultos dentro de las cadenas
regular expression c# (8)
Ha sido un tiempo pero esto no ha sido respondido todavía.
¿Cómo incluir el contenido HMTL en el código de envío? Si lo está leyendo desde un archivo, verifique la codificación del archivo. Si está utilizando UTF-8 con firma (el nombre varía ligeramente entre los editores), esto puede causar un carácter extraño al principio del correo.
Mi problema:
Tengo una aplicación .NET que envía boletines por correo electrónico. Cuando los boletines se ven en Outlook, muestra un signo de interrogación en lugar de un carácter oculto que no puede reconocer. Estos caracteres ocultos provienen de usuarios finales que copian y pegan html que forma los boletines de noticias en un formulario y los envía. A c # trim () elimina estos caracteres ocultos si se producen al final o al principio de la cadena. Cuando el boletín se ve en gmail, gmail hace un buen trabajo ignorándolos. Al pegar estos caracteres ocultos en un documento de Word y activar la opción "Mostrar marcas de párrafo y símbolos ocultos", los símbolos aparecen como un rectángulo dentro de un rectángulo más grande. Además, el texto que compone los boletines puede estar en cualquier idioma, por lo que la aceptación de caracteres Unicode es una necesidad. He intentado recorrer la cadena para detectar el carácter, pero el bucle no lo reconoce y pasa sobre él. También es imposible preguntarle al usuario final que pegue el HTML en el bloc de notas antes de enviarlo.
Mi pregunta:
¿Cómo puedo detectar y eliminar estos caracteres ocultos utilizando C #?
Lo que mejor me funcionó es:
string result = new string(value.Where(c => char.IsLetterOrDigit(c) || (c >= '' '' && c <= byte.MaxValue)).ToArray());
Donde me aseguro de que el carácter sea cualquier letra o dígito, de modo que no ignore ninguna letra que no esté en inglés, o si no es una letra, compruebo si es un carácter ascii mayor o igual que el espacio para asegurarme Ignoro algunos caracteres de control, esto asegura que no ignoro la puntuación.
Algunos sugieren usar IsControl para verificar si el carácter no es imprimible o no, pero eso ignora la marca de izquierda a derecha, por ejemplo.
Puedes eliminar todos los caracteres de control de tu cadena de entrada con algo como esto:
string input; // this is your input string
string output = new string(input.Where(c => !char.IsControl(c)).ToArray());
Aquí está la documentación para el método IsControl()
.
O si solo desea mantener letras y dígitos, también puede usar la función IsLetter
e IsDigit
:
string output = new string(input.Where(c => char.IsLetter(c) || char.IsDigit(c)).ToArray());
Puedes hacerlo:
var hChars = new char[] {...};
var result = new string(yourString.Where(c => !hChars.Contains(c)).ToArray());
Si sabe cuáles son estos caracteres, puede usar string.Replace
. string.Replace
:
newString = oldString.Replace("?", "");
dónde "?" representa el personaje que quieres quitar.
El inconveniente de este enfoque es que debe realizar esta llamada repetidamente si hay varios caracteres que desea eliminar.
Usualmente uso esta expresión regular para reemplazar todos los caracteres no imprimibles.
Por cierto, la mayoría de la gente piensa que las pestañas, el salto de línea y el retorno de carro no son caracteres imprimibles, pero para mí no lo son.
Así que aquí está la expresión:
string output = Regex.Replace(input, @"[^/u0009/u000A/u000D/u0020-/u007E]", "*");
-
^
significa si es alguno de los siguientes: -
/u0009
es pestaña -
/u000A
es/u000A
-
/u000D
es retorno de carro -
/u0020-/u007E
significa todo desde el espacio hasta~
, es decir, todo en ASCII.
Consulte la tabla ASCII si desea realizar cambios. Recuerde que eliminaría todos los caracteres que no sean ASCII.
Para probar más arriba puedes crear una cadena por ti mismo como esta:
string input = string.Empty;
for (int i = 0; i < 255; i++)
{
input += (char)(i);
}
string output = new string (input.Where (c =>! char.IsControl (c)). ToArray ()); Esto seguramente solucionará el problema. Tuve un personaje sustituto no imprimible (ASCII 26) en una cadena que estaba causando que mi aplicación se rompiera y esta línea de código eliminó los caracteres
new string(input.Where(c => !char.IsControl(c)).ToArray());
IsControl pierde algunos caracteres de control como la marca de izquierda a derecha (LRM) (el carácter que normalmente se oculta en una cadena mientras se realiza la copia de la copia). Si está seguro de que su cadena tiene solo dígitos y números, puede usar IsLetterOrDigit
new string(input.Where(c => char.IsLetterOrDigit(c)).ToArray())
Si su cadena tiene caracteres especiales, entonces
new string(input.Where(c => c < 128).ToArray())