Delphi中的字符串比较

时间:2012-09-26 10:59:03

标签: delphi delphi-2009

我有两个字符串,我需要比较相等。

字符串1以这种方式创建:

var
    inBuf: array[0..IN_BUF_SIZE] of WideChar;
    stringBuilder : TStringBuilder;
    mystring1:string;
    ...
begin

stringBuilder := TStringBuilder.Create;

for i := startOfInterestingPart to endOfInterestingPart do
begin
  stringBuilder.Append(inBuf[i]);
end;

mystring1 := stringBuilder.ToString();
stringBuilder.Free;

字符串2是常量字符串'ABC'

当在调试控制台中显示字符串1时,它等于' ABC'。但比较

  1. AnsiCompareText(mystring1, 'ABC')
  2. mystring1 = 'ABC'
  3. CompareStr(mystring1, 'ABC')
  4. 所有报告不平等。

    我想我需要将字符串2('ABC')转换为与字符串1相同的类型。

    我该怎么做?

    更新26.09.2012:

    aMessage在日志输出中显示为{FDI-MSG-START-Init-FDI-MSG-END}

    这是打印字符串长度的代码:

    StringToWideChar('{FDI-MSG-START-Init-FDI-MSG-END}', convString, iNewSize);
    
    ...
    
    OutputDebugString(PChar('Len (aMessage): ' + IntToStr(Length(aMessage))));
    OutputDebugString(PChar('Len (original constant): ' + IntToStr(Length('{FDI-MSG-START-Init-FDI-MSG-END}'))));
    OutputDebugString(PChar('Len (convString): ' + IntToStr(Length(convString))));
    

    这里是日志输出:

    [3580] Len (aMessage): 40
    [3580] Len (original constant): 32
    [3580] Len (convString): 0
    

1 个答案:

答案 0 :(得分:2)

在更新后,Length(aMessage)返回40,而源字符串的长度为32时,看起来您将垃圾数据保存在宽字符串中。

在Delphi中,一个宽字符串与COM BSTR兼容,这意味着它可以保存空字符,null不会终止它,它将其长度保持在字符数据的负偏移处。其中可能的空字符有助于将其转换为其他字符串类型,但它不会改变其自身的终止。

考虑以下内容,

const
  Source = '{FDI-MSG-START-Init-FDI-MSG-END}';
var
  ws: WideString;
  size: Integer;
begin
  size := 40;
  SetLength(ws, size);
  StringToWideChar(Source, PWideChar(ws), size);

  // the below assertion fails when uncommented
//  Assert(CompareStr(Source, ws) = 0);

  ws := PWideChar(ws);  // or SetLength(ws, Length(Source));
  // this assertion does not fail
  Assert(CompareStr(Source, ws) = 0);
end;