2011-07-23 15 views
11

Encontré this pregunta pero elimina todos los caracteres válidos utf-8 también (me devuelve una cadena en blanco, mientras que hay caracteres utf-8 válidos más los caracteres de control). Cuando leo sobre utf-8, no hay un rango específico para control characters y cada juego de caracteres tiene su propio control characters.Eliminando caracteres de control de una cadena UTF-8

¿Cómo puedo modificar la solución above para eliminar solo control characters?

+3

ya sabes, con unas pocas líneas de código (¿qué es exactamente una cadena UTF-8?) Y una pequeña muestra del texto esta comenzaría a parecerse a una verdadera pregunta. –

+0

cadena real es una cadena árabe 'utf-8' con algunos caracteres de punto y coma y control. He proporcionado un enlace a la pregunta más similar: http://stackoverflow.com/questions/20762/how-do-you-remove-invalid-hexadecimal-characters-from-an-xml-based-data-source -pr – Xaqron

+0

¿Cómo se definen los caracteres de control? ¿Aquellos con codepoint '<32'? – CodesInChaos

Respuesta

17

creo que el siguiente código trabajará para usted:

public static string RemoveControlCharacters(string inString) 
{ 
    if (inString == null) return null; 
    StringBuilder newString = new StringBuilder(); 
    char ch; 
    for (int i = 0; i < inString.Length; i++) 
    { 
     ch = inString[i]; 
     if (!char.IsControl(ch)) 
     { 
      newString.Append(ch); 
     } 
    } 
    return newString.ToString(); 
} 
+0

Gracias. Aún así obtengo' Valor especificado tiene una excepción de caracteres de control no válidos al intentar establecer la cadena como un 'HttpHeader'. – Xaqron

+0

@Xaqon No funcionó para todos los caracteres de control. He cambiado la condición a'! char.IsControl (ch) 'y ahora debería funcionar para usted. – Centro

+0

Encontré el problema, no se trata de "caracteres de control" reales. Cualquier carácter especial como '\" ','; 'etc. crea un problema. No tengo idea de cómo eliminarlos de una cadena 'utf-8'. – Xaqron

0

Si va a utilizar la cadena como una cadena de consulta, se debe considerar el uso de la Uri.EscapeUriString() o Uri.EscapeDataString() antes de enviarlo. Nota: ¿Es posible que aún necesite extraer algo de char.IsControl() primero?

16

Esto es cómo ruedo:

Regex.Replace(evilWeirdoText, @"[\u0000-\u001F]", string.Empty) 

Este retira todos los primeros 31 caracteres de control. El siguiente valor hexadecimal desde \ u001F es \ u0020 AKA el espacio. Todo lo que está antes del espacio es todo el avance de línea y una tontería nula.

Creer en mí en los personajes: http://donsnotes.com/tech/charsets/ascii.html

Cuestiones relacionadas