Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 两个不同长度的Powershell字符串是否被视为相等?_String_Powershell_Hidden Characters - Fatal编程技术网

String 两个不同长度的Powershell字符串是否被视为相等?

String 两个不同长度的Powershell字符串是否被视为相等?,string,powershell,hidden-characters,String,Powershell,Hidden Characters,我发现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)‎" 第二行在“(c:c)

我发现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)‎"
第二行在“(c:c)”和“(date)”之间有两个隐藏字符(Unicode字符8206)。我相信它们仍然存在于本文中。因此,这两个字符串的长度不同:

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
那么,这是预期的行为吗?我遗漏了什么吗?我已经编写了足够长的程序,我知道字符串处理可能会很奇怪……但这超出了我的个人经验


如果这是预期行为,如何正确比较两个字符串变量以查看它们是否完全相同?

[string]::等于($L1,$L2,'Ordinal')
。请尝试
“CurrentCulture”
“InvariantCulture”
相反,我想看一个对文化敏感的比较。感谢这个有效的答案,但是它给我留下了一个问题:$L1-eq$L2为什么返回true。这是因为它做了类似于“CurrentCulture”或“InvariantCulture”的事情吗比较?如果我不能信任像$L1这样简单的东西,我该如何工作?eq$L2将返回一个…简单…答案?:)显然,
$L2
包含3个“从左到右标记”字符(U+200e),这些字符在比较中似乎被忽略。这可能与Jon Skeet在其2009年《星期日传奇》中所说的有关。
[String]::Equals($L1,$L2,'Ordinal')
。尝试使用
“CurrentCulture”
“InvariantCulture”
来查看对区域性敏感的比较。感谢您给出的有效答案,但这给我留下了一个问题:为什么$L1-eq$L2返回true。这是因为它在做类似于“当前文化”或“不变文化”的比较吗?如果我不能信任像$L1这样简单的东西,我该如何工作?eq$L2将返回一个。。。简单的。。。回答:)显然,
$L2
包含3个“从左到右标记”字符(U+200e),在比较中似乎被忽略。这可能与乔恩·斯基特在其2009年《周末传奇》中所说的有关。