2011-05-15 124 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

相關問題