【问题标题】:string(";P") is bigger or string("-_-") is bigger?string(";P") 更大还是 string("-_-") 更大?
【发布时间】:2025-12-26 00:30:06
【问题描述】:

在对文本文件进行排序时,我发现非常混乱。不同的算法/应用程序会产生不同的结果,例如比较两个字符串str1=";P"str2="-_-"

仅供参考,这里给出了这些字符串中每个字符的 ASCII:

char(';') = 59;   char('P') = 80;
char('-') = 45;   char('_') = 95;

所以我尝试了不同的方法来确定哪个字符串更大,这是我的结果:

  1. 在 Microsoft Office Excel 排序命令中:

    ";P"

  2. C++ std::string::compare(string &str2),即str1.compare(str2)

    ";P" > "-_-"

  3. C# string.CompareTo(),即str1.CompareTo(str2)

    ";P"

  4. C# string.CompareOrdinal(),即CompareOrdinal(w1, w2)

    ";P" > "-_-"

如图所示,结果各不相同!实际上我的直观结果应该等于方法 2 和 4,因为 ASCII(';') = 59 大于 ASCII('-') = 45 。

所以我不知道为什么 Excel 和 C# string.CompareTo() 给出了相反的答案。请注意,在 C# 中,第二个比较函数名为 string.CompareOrdinal()。这是否意味着默认的 C# string.CompareTo() 函数不是 "Ordinal" ?

谁能解释这种不一致?

谁能在 CultureInfo = {en-US} 中解释一下,为什么它告诉 ;P > -_- ? 潜在的动机或原则是什么?而且我听说过不同文化信息中的不同双倍乘法。这是一种文化冲击..!

【问题讨论】:

  • CompareTo()中的第二个参数。
  • 除了基于序数值的排序之外,另外两个选项是长度比较(不太可能)或字典比较,这很可能是您的“意外”结果的情况。此外,“更大”在这里确实是错误的词。 “更大”的字符串是“-_-”,因为它是 3 个字符,而“;P”是 2 个字符。
  • Order of punctuation marks vs letters 的可能副本。查看我的答案中的链接 - 特别是 CompareOptions.StringSort 之一。

标签: c# c++ char


【解决方案1】:
  1. ?
  2. std::string::compare:“字符比较的结果仅取决于其字符代码”。它只是序数。
  3. String.CompareTo:“使用当前区域性执行单词(区分大小写和区域性)比较”。所以,这不是序数,因为典型的用户不希望事情是这样排序的。
  4. String::CompareOrdinal:顾名思义,“使用序号排序规则执行区分大小写的比较”。

编辑:CompareOptions 有一个提示:“例如,连字符 ("-") 可能分配给它的权重非常小,因此 "coop" 和 "co-op" 在排序列表。”

【讨论】:

  • 我的 CurrentCultrueInfo = {zh-CN};我想知道为什么在 {en-US} cultrue ';'可以小于'-'吗?潜在的动机是什么?对不起,我只能在.Net中找到CultureInfo的定义,但不知道为什么不同的文化应该定义不同的字符比较方法。
  • 添加 1. 以确保数字与问题中的相同。不幸的是,SO 标记不尊重您在构建列表时使用的实际数字。
  • 是的,如果有人能解释为什么 Excel (Office 2003) 也会产生这样的结果?
  • @JXITC:在猜测中,一般认为符号在字母之前,但连字符(尤其是在美国英语中)用于制作复合形容词之类的东西,而不是用于重要的结构,因此被认为是其重要性低于结构性很强的分号。
  • @Tommy 谢谢!这是一个合理的解释。
【解决方案2】:

Excel 2003(及更早版本)会进行忽略连字符和撇号的排序,因此您的排序确实将;_ 进行比较,从而得出您所拥有的结果。这是关于它的Microsoft Support link。相当稀疏,但足以说明问题。

【讨论】:

  • 糟糕!哈哈,我从没想过他们会忽略连字符。有趣!