在以下代码中,为比较的两个操作数添加相同的字母会更改结果。尽管-
不大于j
,但-k
大于jk
。
仅当其中一个操作数为减号(-
)或单引号('
)时才会发生这种情况。
为什么会这样?有什么规则?
if - gtr j (echo - greater than j) else echo - less than j
if "-" gtr "j" (echo "-" greater than "j") else echo "-" less than "j"
echo.
if -k gtr jk (echo -k greater than jk) else echo -k less than jk
if "-k" gtr "jk" (echo "-k" greater than "jk") else echo "-k" less than "jk"
echo.
if ' gtr u (echo ' greater than u) else echo ' less than u
if "'" gtr "u" (echo "'" greater than "u") else echo "'" less than "u"
echo.
if 'v gtr uv (echo 'v greater than uv) else echo 'v less than uv
if "'v" gtr "uv" (echo "'v" greater than "uv") else echo "'v" less than "uv"
结果是:
- less than j
"-" less than "j"
-k greater than jk
"-k" greater than "jk"
' less than u
"'" less than "u"
'v greater than uv
"'v" greater than "uv"
答案 0 :(得分:2)
您可能假设字符串只是按字符进行比较,并采用它们的序数值。
那不是真的。整理比这复杂得多。
实际上,您可以在其他环境中看到相同的内容,例如Windows PowerShell:
PS Home:\> '-' -gt 'j'
False
PS Home:\> '-k' -gt 'jk'
True
PS Home:\> '''' -gt 'u'
False
PS Home:\> '''v' -gt 'uv'
True
很可能字符串的顺序也因您的语言环境而异。
至于你在这里的特殊问题,请引用Unicode Collation Algorithm(UTS#10):
通常,在连接或子字符串操作下不会保留整理顺序。
例如,x小于y的事实并不意味着x + z小于y + z,因为字符可能在子串或连接边界上形成收缩。总结:
x< y并不意味着xz< YZ
x< y并不意味着zx< ZY
xz< yz并不意味着x< ÿ
zx&lt; zy并不意味着x < ÿ
并解决你可能出现的误解:
排序规则不是代码点(二进制)顺序。
这方面的一个简单例子是,资本Z在代码图表中位于小写字母a之前。如前所述,初学者可能会抱怨特定的Unicode字符“不在代码表中的正确位置。”这是对字符编码在整理中的作用的误解。虽然Unicode标准没有无偿地放置字符使得二进制排序是奇数,但获得语言正确顺序的唯一方法是使用语言敏感的排序规则,而不是二进制排序。