Powershell 为什么是;"-"~~~&引用;假的?
正如标题所说,为什么会发生这种情况Powershell 为什么是;"-"~~~&引用;假的?,powershell,Powershell,正如标题所说,为什么会发生这种情况 PS C:\temp> "zzz" -le "~~~" False PS C:\temp> "~~~" -le "zzz" True “~”是倒数第二个ASCII字符。我无法理解排序规则在“z”之前的位置 简单的回答是:这会返回相同的结果 较长的答案是:它不是ASCII值比较。它取决于区域性信息和比较选项,默认情况下使用单词排序 比较使用当前区域性来获取特定于区域性的 信息,如大小写规则和字母顺序 单个字符。例如,区域性可以指定 某些字符组合可
PS C:\temp> "zzz" -le "~~~"
False
PS C:\temp> "~~~" -le "zzz"
True
“~”是倒数第二个ASCII字符。我无法理解排序规则在“z”之前的位置 简单的回答是:这会返回相同的结果
较长的答案是:它不是ASCII值比较。它取决于区域性信息和比较选项,默认情况下使用单词排序
比较使用当前区域性来获取特定于区域性的
信息,如大小写规则和字母顺序
单个字符。例如,区域性可以指定
某些字符组合可以被视为单个字符,
或以特定方式比较大小写字符,
或者字符的排序顺序取决于字符
在它之前或之后
使用单词排序规则执行比较。更多
有关单词、字符串和顺序排序的信息,请参阅
例子
这是因为
~
(tilde)是一个变音符号,默认比较是语言比较,而不是顺序。在排序时,语言比较忽略了发音符号。这一切都是Unicode的结果
尝试:
C#中的类似答案是
下面是使用en-US
区域性与一些带有变音符号的字符串进行的较大比较:
PS C:\> $x = @("0","9","a","A","á","Á","ab","aB","Ab","áb","Áb","Æ","z","Z","~")
PS C:\> [Array]::Sort($x)
PS C:\> $x
~
0
9
a
A
á
Á
ab
aB
Ab
áb
Áb
Æ
z
Z
PS C:\> [Array]::Sort($x,[StringComparer]::Ordinal)
PS C:\> $x
0
9
A
Ab
Z
a
aB
ab
z
~
Á
Áb
Æ
á
áb
那么,哪一个是正确的?这将取决于您的应用程序,但.Net Framework默认为基于区域性的比较
据我所知,字符串比较默认为区分大小写的[System.StringComparer]::CurrentCulture
,不区分大小写的[System.StringComparer]::CurrentCultureIgnoreCase
。我不知道有什么办法可以直接改变这一点。即使使用不变的区域性似乎也不会影响某些事情:
PS C:\> [System.Threading.Thread]::CurrentThread.CurrentCulture = [System.Globalization.CultureInfo]::InvariantCulture
PS C:\> [System.Array]::Sort($x)
PS C:\> $x
~~~
aaa
zzz
PS C:\> $x[0] -le $x[1]
True
要强制进行顺序比较,请执行以下操作:
如果结果为负值,则$StringA
小于$StringB
如果结果为零,则
$StringA
等于$StringB
如果结果为正,则
$StringA
大于$StringB
因此,这:
'zzz' -le '~~~'
与顺序比较相当于:
PS C:\> [System.String]::CompareOrdinal('zzz','~~~') -le 0
True
我可以理解单词排序的用处,但我不同意将其用作编程语言的默认比较排序规则!我能够解决这个问题——我唯一的目的是在列表的末尾有一个默认的停止点,可以在参数中重写。但这种行为确实令人惊讶。@RossPresser查看我的更新。您可以使用
String.CompareOrdinal
强制对字符串进行顺序比较。
[System.String]::CompareOrdinal($StringA,$StringB)
'zzz' -le '~~~'
PS C:\> [System.String]::CompareOrdinal('zzz','~~~') -le 0
True