是否有必要在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结尾的字符串的指针。 所以如果你打电话给:

var
    s1, s1: AnsiString;
begin
    s1 := 'Hello';
    s2 := 'world';

    nCompare := StrCmpLogicalW(s1, s2);
end;

当您尝试将AnsiString传递到接受UnicodeString的函数时,编译器会在生成的代码中为您自动调用MultiByteToWideChar

CompareString支持Windows 7中的数字排序

从Windows 7开始,Microsoft将SORT_DIGITSASNUMBERS添加到CompareString

Windows 7:在排序过程中将数字视为数字,例如,在“10”之前排序“2”。

这些都无助于回答实际问题,该问题涉及何时必须转换或投射字符串。


您的功能可能有一个ANSI变体(我没有选中)。 大多数API都可以作为ANSI版本使用,只需将W后缀更改为A即可。 在这种情况下,Windows会为您进行透明的来回转换。

PS:以下是一篇描述缺少StrCmpLogicalA的文章:http://blogs.msdn.com/joshpoley/archive/2008/04/28/strcmplogicala.aspx

链接地址: http://www.djcxy.com/p/61481.html

上一篇: Is it necessary to convert string to WideString in Delphi?

下一篇: Passing data to textarea inside bootstrap modal that uses TINYMCE WYSIWYG