我发现一个Windows API函数执行字符串的“自然比较”。定义如下:
int StrCmpLogicalW( LPCWSTR psz1,LPCWSTR psz2 );
要在Delphi中使用它,我以这种方式宣布:
interface function StrCmpLogicalW(psz1,psz2: PWideChar): integer; stdcall; implementation function StrCmpLogicalW; external 'shlwapi.dll' name 'StrCmpLogicalW';
因为它比较了Unicode字符串,当我想比较ANSI字符串时,我不知道如何调用它。似乎足以将字符串放置到WideString,然后到FlideChar,但是我不知道这种方法是否正确:
function AnsiNaturalCompareText(const S1,S2: string): integer; begin Result := StrCmpLogicalW(PWideChar(WideString(S1)),PWideChar(WideString(S2))); end;
我对字符编码知之甚少,这是我问题的原因。这个功能是否正常,或者我应该首先将比较的字符串转换成某种方式吗?
解决方法
请记住,将一个字符串转换为WideString会使用默认的系统代码页进行转换,该代码页可能是也可能不是您需要的。通常,您希望使用当前用户的区域设置。
从System.pas中的WCharFromChar:
Result := MultiByteToWideChar(DefaultSystemCodePage,CharSource,SrcBytes,WCharDest,DestChars);
您可以通过调用SetMultiByteConversionCodePage来更改DefaultSystemCodePage。