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

car*_*tas 7 c# string

有没有简单的方法如何检测(在调试期间),该字符串包含一些隐藏的字符(例如零宽度空间)?

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

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

Jon*_*eet 5

怎么样:

text.Contains("\u200B")
Run Code Online (Sandbox Code Playgroud)

要么

text.IndexOf('\u200B') != -1
Run Code Online (Sandbox Code Playgroud)

  • @Petr:没有更多信息,这不是一个有用的评论.请给出一个*示例*它不起作用的地方,或者问一个新问题. (2认同)

Sim*_*Var 5

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

str.Contains("\u8203");
Run Code Online (Sandbox Code Playgroud)

或者将其放在观察窗口中,这样您只需要点击观察值附近的刷新按钮即可查看结果,而不是立即重新输入(尽管您可以随时按下,然后输入以重新输入最后一个命令!)

要检查任何隐藏字符,您可以拥有一个包含所有隐藏字符的静态数组,并检查:

HIDDENS.Any(c => str.Contains(c.ToString())
Run Code Online (Sandbox Code Playgroud)

并且最好甚至将隐藏的字符保存为一个长度的字符串然后执行:

HIDDENS.Any(str.Contains)
Run Code Online (Sandbox Code Playgroud)

或者你可能真的很复杂并做到这一点:

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));
}
Run Code Online (Sandbox Code Playgroud)

从这里也可以很容易地返回有关每个隐藏角色的信息等.