2011-05-15 126 views
1

在以下代码中,将相同的字母添加到比较的两个操作数都会更改结果。尽管-不大于j-k大于jkif语句中减号和单引号会起什么作用?

仅当其中一个操作数是减号(-)或单引号(')时才会发生这种情况。

为什么会出现这种情况?规则是什么?

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" 

回答

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 

这很可能是字符串的顺序与您的locale都在变化。

至于这里您的特定问题,从Unicode Collation Algorithm(UTS#10)报价:

整理顺序不是根据级联或子操作保存,一般。

例如,x小于y的事实并不意味着x + z小于y + z,因为字符可能在子串或连接边界上形成收缩。总结:

X < Y不意味着XZ < YZ
X <Ÿ
ZX < ZY没有Y不意味着ZX < ZY
XZ < YZ并不意味着X <意味着X <Ÿ

,解决你下很可能会在misconveption:

排序不是代码点(二进制)顺序。

一个简单的例子就是大写字母Z在代码表中的小写字母a之前。如前所述,初学者可能会抱怨特定的Unicode字符“不在代码表中的正确位置”。这是误解了字符编码在整理中的作用。尽管Unicode标准没有无意地放置字符,使得二进制排序很奇怪,但获得语言正确顺序的唯一方法是使用语言敏感整理,而不是二进制排序。

+0

谢谢!我需要更多关于这方面的研究。 – neorobin 2012-05-02 17:33:41

相关问题