2012-04-03 27 views
7

¿Hay alguna manera fácil de detectar (durante la depuración), esa cadena contiene algún carácter oculto (por ejemplo, espacio de ancho cero)?Cómo detectar caracteres ocultos en cadena (por ejemplo, espacio de ancho cero) durante la depuración

Ejemplo: Durante la depuración estoy comparando dos cadenas de differnet y parecen iguales a mis ojos. Por supuesto, difieren en algunos personajes ocultos. ¿Cómo encontrar la diferencia?

He usado el método string.ToCharArray() en "ventana Inmediata" de Visual Studio, pero debe haber una manera más cómoda.

Respuesta

5

¿Qué tal:

text.Contains("\u200B") 

O

text.IndexOf('\u200B') != -1 
+0

esta no funcionan – Petr

+2

@Petr : Sin más información, no es un comentario útil. Por favor, den un * ejemplo * de dónde no funciona, o hagan una nueva pregunta. –

+0

@Petr no funcionaba porque había un error en la referencia de caracteres de espacio de ancho cero. Debería especificarse en formato HEX - ** '\ u200B' ** y no como en el formato DEC - '\ u8203'. –

6

Usted puede utilizar esto en la ventana inmediata:

str.Contains("\u8203"); 

o ponerlo en la ventana de inspección por lo que sólo voy tiene que hacer clic en el botón de actualización cerca del valor observado para ver el resultado, en lugar de volver a ingresarlo a la inmediata (aunque ! Siempre se puede presionar hacia arriba y luego ingresar a volver a entrar en el último comando)

para comprobar cualquier personaje oculto, puede tener una matriz estática con todos los personajes ocultos y comprobar:

HIDDENS.Any(c => str.Contains(c.ToString()) 

y preferible incluso salvar los personajes ocultos como cadenas de una sola longitud y luego hacer:

HIDDENS.Any(str.Contains) 

O bien, podría ser muy sofisticada y hacer esto:

private static readonly Bitmap BMP = new Bitmap(1000, 1000); 
private static readonly Graphics GRAPHICS = Graphics.FromImage(BMP); 
private static readonly Font FONT = new Font("Arial", 20); 
private static readonly RectangleF RECT = new RectangleF(0, 0, 1000, 1000); 

public static bool CheckInvisibleChars(string text) 
{ 
    var stringFormat1 = new StringFormat(StringFormatFlags.MeasureTrailingSpaces); 
    stringFormat1.SetMeasurableCharacterRanges(
     Enumerable.Range(0, text.Length - 2).Select(i => new CharacterRange(i, 1)).ToArray()); 

    return GRAPHICS.MeasureCharacterRanges(text, FONT, RECT, stringFormat1).Any(
     reg => reg.GetBounds(GRAPHICS).Width.Equals(0f)); 
} 

Desde aquí también debe ser fácil para devolver información acerca de cada personaje oculto, etc.

+0

Probablemente no elegí un buen título para mi pregunta (ya le he cambiado el nombre). Me refiero a cómo detectar cualquier carácter oculto (no solo "\ u8203") – cartas

+0

@cartas Echa un vistazo a la edición – SimpleVar

+0

La función CheckInvisibleChars es genial. ¡Gracias! Por cierto. ¿Hay alguna forma de GUI que rápidamente "muestre" caracteres invisibles? Me refiero a algún editor o algo así. – cartas

1

Para mí funciona:

text.Contains((char)8203) 

y

text.IndexOf((char)8203) 
Cuestiones relacionadas