Delphi 当使用Unicode字符串调用时,StrLComp与AnsiStrLComp

Delphi 当使用Unicode字符串调用时,StrLComp与AnsiStrLComp,delphi,unicode,delphi-xe,string-comparison,Delphi,Unicode,Delphi Xe,String Comparison,当使用Unicode字符串调用时,我对“Ansi”和“常规”rtl字符串函数有点困惑。我知道在旧版本的Delphi中(当Ansistring是默认值时),“Ansi”版本处理多字节字符。在处理Unicode字符串时,这是否意味着什么?假设我需要处理韩文字符,并且我的代码不必与旧的Delphi版本兼容,那么应该使用哪些rtl函数?不确定您到底想做什么,但是 如果要按当前用户区域设置规则比较两个字符串,请将用于区分大小写的比较或不区分大小写的比较。这些函数在内部使用具有区域设置的函数 如果要使用D

当使用Unicode字符串调用时,我对“Ansi”和“常规”rtl字符串函数有点困惑。我知道在旧版本的Delphi中(当Ansistring是默认值时),“Ansi”版本处理多字节字符。在处理Unicode字符串时,这是否意味着什么?假设我需要处理韩文字符,并且我的代码不必与旧的Delphi版本兼容,那么应该使用哪些rtl函数?

不确定您到底想做什么,但是

  • 如果要按当前用户区域设置规则比较两个字符串,请将用于区分大小写的比较或不区分大小写的比较。这些函数在内部使用具有区域设置的函数

  • 如果要使用Delphi内部比较机制比较两个字符串,请将函数用于区分大小写的比较或不区分大小写的比较

因此,如果您将两个相同的字符串与具有不同用户区域设置的计算机进行比较,您可能会得到不同的结果,但另一方面,您可以对应用程序的用户语言设置进行自然排序。
and将以相同的方式在所有机器上工作,区域设置独立。

字符串比较函数的“Ansi”前缀实际上从未表示在比较字符串时考虑区域设置,而不是“仅”进行简单的二进制比较。在Unicode世界中,情况仍然如此。Ansi*系列函数还将(Unicode)字符串作为其参数,并在进行比较时考虑语言环境

来自AnsiCompareStr文件(D2009):

大多数区域都认为小写字符小于 对应的大写字符。这与ASCII相反 小写字符大于大写字符的顺序 人物。因此,将S1设置为“a”,将S2设置为“a” AnsiCompareStr返回小于零的值,而CompareStr, 使用相同的参数,返回大于零的值

“考虑区域设置”的效果可能因区域设置而异。这可能与重音字符有关,也可能与否。在Unicode版本中,实际上可能会考虑字符的组成方式。例如,重音e(é)的编码可能与此完全相同,但也可能被编码为两个单独的项目:重音和e

SysUtils单元中包括Ansi*和“正常”字符串比较函数。它们都以字符串作为参数,在Unicode Delphi中这确实意味着字符串

如果需要使用AnsiStrings,则需要使用AnsiStrings单元。它具有相同的字符串比较函数集,但在本单元中,它们都将ansistring作为参数


现在,如果您不需要与旧版本兼容:请使用SysUtils中的标准函数。如果字节比较足够,则使用普通字节。如果需要考虑区域设置,请使用Ansi函数。

简单的答案是,当涉及到Delphi字符串例程时,您应该为Unicode字符串使用Ansi…()函数

但是,如果你正在比较字符串(除其他事项外),那么你还需要首先考虑这些字符串的归一化,这取决于应用程序的性质和需求(以及字符串的来源)来处理。