none
string.Compare("A","a")为什么等于1 RRS feed

答案

  • string.Compare(StrA,StrB)函数返回值
    一、Less than zero StrA precedes StrB in the sort order
    二、Zero StrA occurs in the same position as StrB in the sort order
    三、Greater than zero StrA follows StrB in the sort order

    函数返回值小于零还是大于零,关键问题确定sort order是什么,是Unicode编码,还是其他。

    从 .Net 文章中的解释,sort order很可能是参考权重表制定的。
    Win10版本权重Weights由4个字节(脚本成员SM、字母权重AW、变音权重DW、大写权重CW)组成,
    脚本成员和字母权重共同构成2个字节的Unicode Weights,东亚语言环境中变音权重也被提升至UW中,成为3字节权重。
    Unicode Weights是sort order判断的先决条件,其次依据变音权重,第三看大写权重。

    由下图可见,字符"A"和"a"的UW及变音权重都为"0E 02 02",即两个比较字符串第一个位置上字符权重值相同返回Zero,
    但是再比较CW值,"A"为12,"a"为2,2 precedes 12, 12 follows 2, 因此在不忽略大小写的情况下,string.Compare("A","a")返回值是大于零的。

    2021年1月26日 5:53

全部回复

  • Hi 朋友的朋友,

    String.Compare方法是用于比较两个字符串的位置,若第一个字符串在第二个字符串前面,则返回数字1,反之,则返回0,如果两者位置相同,则返回。

    根据unicode的编码顺序,我们可以查到A的位置是0034,而a的位置是0066。

    上面的图片你可以在维基百科中搜索unicode字符列表来了解具体字符的位置。

    Best Regards,

    Jack


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2020年11月2日 2:04
    版主
  • 多谢,明白了,原来用的是Unicode顺序。受别的语言的影响,一直弄成了Ascii码值大小。
    2021年1月21日 0:08
  • 我又看了看MSDN文档,感觉有点儿晕了,它好像说的是A在B之前,返回小于0:
    2021年1月21日 0:36
  • String.Compare方法是不能比较两个字符串的位置,

    而是比较两个字符串中对应位置的字符,

    若每个对应位置的字符相同,则String.Compare函数返回0值。

    2021年1月21日 1:42
  • 感谢您的答复,等于0的情况已经比较明确了。现在不明确的是,就单个字符而言,在使用这个方法的时候,什么情况下返回1,什么情况下返回-1。
    2021年1月21日 2:03
  • 函数返回值1或者-1,是由编译程序决定的,建议直接查找和分析Compare函数的源代码,比参考任何文档资料都靠谱。
    2021年1月21日 8:47
  • ; Weights are 4 bytes: SM, AW, DW & CW.  Together the SM + AW are "Unicode Weight"
    ;   SM - Script Member
    ;   AW - Alphabetic Weight
    ;   DW - Diacritic Weight
    ;   CW - Case Weight
    ;
    ; For the most part, strings are sorted with all of the "Unicode Weights" being primary, then
    ; the diacritic and case weights as being secondary and tertiary weights.  (a few more extra
    ; weights follow that).
    ;
    ; The sort keys generated are the "Unicode Weight" of the entire string, delimited by 01, then
    ; the Diacritic (or secondary) weight, then another 01 delimiter, then the Case (or tertiary)
    ; weight.  The code also adds two more sections, again delimited by 01.  Weights are 0 terminated.
    2021年1月25日 7:45
  • string.Compare(StrA,StrB)函数返回值
    一、Less than zero StrA precedes StrB in the sort order
    二、Zero StrA occurs in the same position as StrB in the sort order
    三、Greater than zero StrA follows StrB in the sort order

    函数返回值小于零还是大于零,关键问题确定sort order是什么,是Unicode编码,还是其他。

    从 .Net 文章中的解释,sort order很可能是参考权重表制定的。
    Win10版本权重Weights由4个字节(脚本成员SM、字母权重AW、变音权重DW、大写权重CW)组成,
    脚本成员和字母权重共同构成2个字节的Unicode Weights,东亚语言环境中变音权重也被提升至UW中,成为3字节权重。
    Unicode Weights是sort order判断的先决条件,其次依据变音权重,第三看大写权重。

    由下图可见,字符"A"和"a"的UW及变音权重都为"0E 02 02",即两个比较字符串第一个位置上字符权重值相同返回Zero,
    但是再比较CW值,"A"为12,"a"为2,2 precedes 12, 12 follows 2, 因此在不忽略大小写的情况下,string.Compare("A","a")返回值是大于零的。

    2021年1月26日 5:53
  • 有点儿好奇,你们的这些表都是哪儿来的?
    2021年1月27日 3:26