Две строки Powershell разной длины считаются равными?

Я нашел что-то необычное в строках PowerShell... Я надеюсь, что это просто то, чего мне не хватает. Вот что я нашел.

Я скопировал некоторые данные с веб-страницы (KQL ищет O365, если кому-то все равно), и он содержал скрытые управляющие символы. Вот две строки, которые я сохранил в переменных PowerShell:

PS C:\Users> $L1 = "(c:c)(date=01/01/2014..11/01/2016)"
PS C:\Users> $L2 = "(c:c)‎‎(date=01/01/2014..11/01/2016)‎"

Во второй строке есть два скрытых символа (символ Unicode 8206) между "(c:c)" и "(date". Я думаю, что они все еще есть в этом посте. Из-за этого две строки имеют разную длину:

PS C:\Users> $L1.Length
34

PS C:\Users> $L2.Length
36

И все же, когда я проверяю, равны ли они друг другу, PowerShell говорит мне, что они:

PS C:\Users> $L1 -eq $L2
True

Теперь я знаю, что понимает, что там есть различия. Я могу использовать метод substring, чтобы извлечь некоторые символы и показать, что подстроки не равны:

PS C:\Users> $L1.Substring(4,8)
)(date=0

PS C:\Users> $L2.Substring(4,8)
)‎‎(date

Если я использую оператор -eq для сравнения этих подстрок, я получу правильный ответ:

PS C:\Users> $L1.Substring(4,8) -eq $L2.Substring(4,8)
False

Но если я заставлю строки отображать одно и то же, изменив количество символов, которые я беру, чтобы получить те же 6 видимых символов, то PowerShell скажет мне, что они равны:

PS C:\Users> $L1.Substring(4,6)
)(date

PS C:\Users> $L2.Substring(4,8)
)‎‎(date

PS C:\Users> $L1.Substring(4,6) -eq $L2.Substring(4,8)
True

Итак, это ожидаемое поведение? Я что-то пропустил? Я программировал достаточно долго, и я знаю, что обработка строк может быть странной... но это выходит за рамки моего личного опыта.

Если это ожидаемое поведение, как правильно сравнить две строковые переменные, чтобы увидеть, являются ли они абсолютно одинаковыми?

0 ответов

Другие вопросы по тегам