Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.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
Powershell 为什么是;"-"~~~&引用;假的?_Powershell - Fatal编程技术网

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