2012-04-03 45 views
7

如何检测(在调试期间)该字符串是否包含一些隐藏字符(例如零宽度空间)?如何在调试过程中检测字符串中的隐藏字符(例如零宽度空间)

示例:在调试过程中,我比较了两个不同的字符串,它们看起来与我的眼睛相同。当然,他们在一些隐藏的字符中有所不同。如何找到差异?

我在Visual Studio的“立即窗口”中使用了string.ToCharArray()方法,但必须有更舒适的方式。

回答

5

如何:

text.Contains("\u200B") 

或者

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

这不工作 – Petr 2014-02-28 13:30:07

+2

@Petr :没有更多的信息,这不是一个有用的评论。请举例说明*它不起作用的地方,或者提出一个新问题。 – 2014-02-28 13:58:58

+0

@Petr它没有工作,因为在零宽度空间字符引用有错误。它应该以十六进制格式指定 - **'\ u200B'**,而不是以DEC格式 - '\ u8203'指定。 – 2016-01-20 13:38:27

6

你可以使用这个在即时窗口:

str.Contains("\u8203"); 

或者把它放在监视窗口,所以你只是必须单击观察值附近的刷新按钮才能看到结果,而不是将其重新输入到立即(尽管您!可一直按起来,然后进入重新进入最后的命令)

来检查任何隐藏的字符,你可以与所有的隐藏字符的静态数组和检查:

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

而且最好甚至保存的隐藏字符作为一个长字符串,然后做:

HIDDENS.Any(str.Contains) 

,或者你可以真正成熟,这样做:

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)); 
} 

从这里也应该很容易,以返回隐藏的字符信息等

+0

我可能没有选择好的标题给我的问题(我已经重新命名了它)。我的意思是如何检测任何隐藏的字符(不仅仅是“\ u8203”) – cartas 2012-04-03 12:39:17

+0

@cartas检查编辑 – SimpleVar 2012-04-03 16:12:26

+0

CheckInvisibleChars功能很酷。谢谢! Btw。有没有任何GUI方式可以快速“显示”不可见的字符?我的意思是一些编辑或类似的东西。 – cartas 2012-04-04 07:22:46

1

对我的作品:

text.Contains((char)8203) 

text.IndexOf((char)8203) 
相关问题