String 两个不同长度的Powershell字符串是否被视为相等?
我发现PowerShell字符串有一些不寻常的地方…我希望这只是我缺少的东西。这是我发现的 我从一个网页复制了一些数据(如果有人在意,KQL会搜索O365),其中包含隐藏的控制字符。以下是我在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)
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年《周末传奇》中所说的有关。