Question

I have two strings, which I need to compare for equality.

String 1 is created in this way:

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;

String 2 is a constant string 'ABC'.

When string 1 is displayed in a debug console, it is equal to 'ABC'. But the comparisons

  1. AnsiCompareText(mystring1, 'ABC')
  2. mystring1 = 'ABC'
  3. CompareStr(mystring1, 'ABC')

all report inequality.

I suppose that I need to convert string 2 ('ABC') to the same type as the string 1.

How can I do that?

Update 26.09.2012:

aMessage is displayed in the log output as {FDI-MSG-START-Init-FDI-MSG-END}

Here's the code for printing the length of strings:

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))));

And here's the log output:

[3580] Len (aMessage): 40
[3580] Len (original constant): 32
[3580] Len (convString): 0
Was it helpful?

Solution

It looks like you're keeping garbage data in your wide string after the meaningful part, in your update, Length(aMessage) returns 40, while your source string's length is 32.

In Delphi a wide string is COM BSTR compatible, meaning it can hold null characters, a null does not terminate it, it keeps its length at a negative offset of the character data. A possible null character in it helps it to be converted to other string types, but it doesn't alter its own termination.

Consider the below,

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;
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top