我在排序文本文件时发现非常混乱。不同的算法/应用程序产生不同的结果,例如,比较两个字符串str1=";P"
和str2="-_-"
这里仅供您参考,为这些字符串中的每个字符提供ASCII:
char(';') = 59; char('P') = 80;
char('-') = 45; char('_') = 95;
所以我尝试了不同的方法来确定哪个字符串更大,这是我的结果:
在Microsoft Office Excel 排序命令中:
“; P”< “-_-”
C ++ std :: string :: compare(string& str2),即str1.compare(str2)
“; P”> “-_-”
C#string.CompareTo(),即str1.CompareTo(str2)
“; P”< “-_-”
C#string.CompareOrdinal(),即CompareOrdinal(w1, w2)
“; P”> “-_-”
如图所示,结果多种多样!实际上我的直观结果应该等于方法2和4,因为ASCII(';')= 59大于ASCII(' - ')= 45。
所以我不知道为什么Excel和C#string.CompareTo()给出了相反的答案。注意到在C#中第二个比较函数名为string.CompareOrdinal()
。这是否意味着默认的C#string.CompareTo()
函数不是“序数”?
有人能解释这种不一致吗?
任何人都可以在CultureInfo = {en-US}中解释,为什么它会告诉; P> -_-?什么是潜在的动机或原则?而且我听说过不同文化信息中的不同双重乘法。这是一种文化冲击......!
答案 0 :(得分:5)
std::string::compare
:“字符比较的结果仅取决于其字符代码”。这很简单。String.CompareTo
:“使用当前文化执行单词(区分大小写和文化敏感)比较”。所以,这不是有序的,因为典型的用户不希望事情像那样排序。String::CompareOrdinal
:根据名称,“使用序数排序规则执行区分大小写的比较”。编辑:CompareOptions
有一个提示:“例如,连字符(” - “)可能会分配一个非常小的权重,以便”coop“和”co-op“显示在彼此旁边在排序列表中。“
答案 1 :(得分:3)
Excel 2003(及更早版本)进行了忽略连字符和撇号的排序,因此您的排序实际上会将;
与_
进行比较,从而得出您拥有的结果。这是关于它的Microsoft Support link。相当稀疏,但足以说明问题。