質問

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
役に立ちましたか?

解決

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;
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top