是否有必要在Delphi中将字符串转换为WideString?
我发现了一个执行字符串“自然比较”的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然后转换为PWideChar,但是,我不知道这种方法是否正确:
function AnsiNaturalCompareText(const S1, S2: string): integer;
begin
Result := StrCmpLogicalW(PWideChar(WideString(S1)), PWideChar(WideString(S2)));
end;
我对字符编码知之甚少,所以这是我的问题的原因。 这个函数是OK还是应该首先转换两个比较字符串?
请记住,将字符串转换为WideString将使用默认的系统代码页进行转换,这可能会或可能不是您需要的。 通常,您希望使用当前用户的区域设置。
从WCharFromChar
中的WCharFromChar
:
Result := MultiByteToWideChar(DefaultSystemCodePage, 0, CharSource, SrcBytes,
WCharDest, DestChars);
您可以通过调用SetMultiByteConversionCodePage来更改DefaultSystemCodePage。
完成任务的更简单的方法是将您的函数声明为:
interface
function StrCmpLogicalW(const sz1, sz2: WideString): Integer; stdcall;
implementation
function StrCmpLogicalW; external 'shlwapi.dll' name 'StrCmpLogicalW';
因为WideString
变量是指向WideChar
的指针(同样, AnsiString
变量是指向AnsiChar
的指针)。
这样Delphi会自动将一个AnsiString“上变换”为一个WideString
。
更新
由于我们现在处于UnicodeString
的世界, UnicodeString
您可以这样做:
interface
function StrCmpLogicalW(const sz1, sz2: UnicodeString): Integer; stdcall;
implementation
function StrCmpLogicalW; external 'shlwapi.dll' name 'StrCmpLogicalW';
因为UnicodeString
变量仍然是指向以WideChars
结尾的