Delphi中的字符串比较

3
我有两个字符串,需要比较它们是否相等。
第一个字符串是这样创建的:
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')

都报告不相等。

我想我需要将字符串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. mystring.length是什么?
  2. 如果长度相同-制作一个循环,逐个字符比较哪些字符相同,以及何时不同。
  3. 如果/当发现不同的字符,请比较两个字符串的Word(char)。我猜你明白"ABC"和"АВС"没有任何共同的字母。
- Arioch 'The
将字符串2('ABC')转换为与字符串1相同的类型--我认为没有必要,但如果您坚持--var mystring1,mystring2:string;... mystring2:= 'ABC'; - Arioch 'The
AnsiCompareText(aMessage, 'ABC') 你是要比较aMessage还是mystring1? - Arioch 'The
现在发生了一件奇怪的事情。在一台机器上,AnsiCompareText(mystring1, 'ABC') 报告相等,而在另一台机器上则不是。在两种情况下,mystring1 都来自于一个 C# 应用程序(在两台机器上,C# 应用程序都在 Visual Studio 10 中运行)。唯一的区别是操作系统 - 在它正常工作的机器上,它是 Windows 7,在另一台机器上(它无法工作),它是 Windows XP Professional,版本为 2002,服务包 3。 - Glory to Russia
在这两种情况下,mystring1 都是从 C# 应用程序接收的。然后比较两台机器上输入缓冲区的内容。那么关于顶部注释的细节呢? - Arioch 'The
显示剩余5条评论
1个回答

2
在你的更新中,似乎在有意义的部分之后,你将垃圾数据存储在宽字符串中。当你调用Length(aMessage)时,返回的是40,而你源字符串的长度只有32。
在Delphi中,宽字符串与COM BSTR兼容,这意味着它可以包含空字符,一个空字符不会终止它,它保持其字符数据的负偏移量的长度。它中可能有一个空字符,以帮助它转换为其他字符串类型,但它并不改变自己的终止符。
请考虑下面的内容:
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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接