如何在调试期间检测字符串中的隐藏字符(例如零宽度空格)

本文关键字:字符 空格 隐藏 调试 字符串 检测 | 更新日期: 2023-09-27 18:29:47

有什么简单的方法可以检测(在调试期间)该字符串是否包含一些隐藏字符(例如零宽度空间)?

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

我用的是绳子。ToCharArray()方法,但必须有更舒适的方法。

如何在调试期间检测字符串中的隐藏字符(例如零宽度空格)

您可以在即时窗口中使用它:

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

从这里返回每个隐藏字符的信息也应该很容易。

怎么样:

text.Contains("'u200B")

text.IndexOf(''u200B') != -1

对于我的作品:

text.Contains((char)8203)

text.IndexOf((char)8203)