Mar*_*rkF 4 delphi unicode string-comparison delphi-xe
当用Unicode字符串调用时,我对"Ansi"vs"常规"rtl字符串函数有点混淆.据我所知,在旧版本的Delphi(当Ansistring是默认值时),"Ansi"版本处理多字节字符.在处理Unicode字符串时这是否意味着什么?假设我需要处理韩文字符,并且我的代码不必与旧的Delphi版本兼容,应该使用哪些rtl函数?
字符串比较函数的'Ansi'前缀实际上从未表示除了在比较字符串时考虑区域设置而不是"只是"简单的二进制比较时所考虑的任何内容.在Unicode世界中,情况仍然如此.Ansi*函数系列还将(Unicode)字符串作为参数,并在进行比较时考虑区域设置.
来自AnsiCompareStr doc(D2009):
大多数语言环境都认为小写字符小于相应的大写字符.这与ASCII顺序形成对比,其中小写字符大于大写字符.因此,将S1设置为"a"并将S2设置为"A"会导致AnsiCompareStr返回小于零的值,而具有相同参数的CompareStr将返回大于零的值.
"考虑区域设置"的影响可能因区域而异.它可能与重音字符有关.在Unicode版本中,它实际上可能会考虑字符的组成方式.例如,重音e(é)可以完全相同地编码,但也可以编码为两个单独的项目:重音和e.
Ansi*和"普通"字符串比较函数都包含在SysUtils单元中.它们都以字符串作为参数,在Unicode Delphi中确实意味着UnicodeStrings.
如果您需要使用AnsiStrings,则需要使用AnsiStrings单元.它具有相同的字符串比较函数集,但在此单元中,它们都将AnsiStrings作为其参数.
现在,如果您不需要与旧版本兼容:使用SysUtils的标准功能.如果字节比较足够,请使用normale.如果需要考虑区域设置注意事项,请使用Ansi.