Delphi字符串比较函数有什么区别?

时间:2013-06-03 11:46:39

标签: delphi string-comparison

有很多方法可以比较现代Delphi中的字符串(比如2010-XE3):

  • '< ='运算符,解析为UStrCmp / LStrCmp
  • CompareStr
  • AnsiCompareStr

原则上,有人可以给出(或指向)这些方法的描述吗?

到目前为止,我已经认为AnsiCompareStr在Windows上调用CompareString,这是一种“文本”比较(即考虑到unicode组合字符等)。简单的CompareStr不这样做,而是似乎做了二进制比较。

但是CompareStr和UStrCmp有什么区别?在UStrCmp和LStrCmp之间?它们都产生相同的结果吗?这些结果是否会在Delphi版本之间发生变化?

我问,因为我需要进行比较,这将始终产生相同的结果,因此使用一个版本的Delphi构建的应用程序中的索引与使用另一个版本构建的代码保持一致。

1 个答案:

答案 0 :(得分:7)

AnsiCompareStr被指定为考虑区域设置,并且无论Delphi版本如何都应返回相同的结果,但可能会根据Windows版本和/或设置返回不同的结果。CompareStr是纯二进制文件比较:“比较操作基于每个字符的16位序数值,不受当前语言环境的影响”(对于CompareStr(const S1, S2: string)重载)。 UStrCmp也使用纯二进制比较:“根据构成字符串的字符的序数值来比较字符串。”所以后两者之间不应该有区别。它们返回结果的方式是不同的,因此需要两个实现(尽管可以让一个实现依赖另一个)。

至于LStrCmpUStrCmp之间的差异,LStrCmp需要AnsiString s,UStrCmp需要UnicodeString s。两个字符(假设A和B)完全有可能在错误命名的“ANSI”代码页中被排序为A< B,但以Unicode排序为A> B.您几乎应该只使用适合您所拥有数据的比较。