【问题标题】:Can not assign char array to string in Delphi 10.2无法在 Delphi 10.2 中将 char 数组分配给字符串
【发布时间】:2018-10-17 01:56:03
【问题描述】:

我有以下变量声明:

arrChar_1: array[0..2] of Char;
arrChar_2: array[0..2] of Char;
str: string;

然后我做了作业:

str := arrChar_1 + arrChar_2;

这个赋值在 Delphi 6 上正常工作。但是当我在 Delphi 10.2 上编译它时出错:

[dcc32 Error] MigrateConcatenateCharArray.dpr(26): E2008 Incompatible types

我正在通过以下方式解决这个问题:

str := Copy(first_arrChar, 0, StrLen(first_arrChar));
str := str + Copy(second_arrChar, 0, StrLen(second_arrChar));

这个问题还有其他好的解决方案吗? (1)


在 Delphi 6 中:

String = AnsiString
Char = AnsiChar

在德尔福 10.2 中:

String = UnicodeString
Char = WideChar

能否告诉我是什么导致了不兼容问题的发生? (2)

我知道widechar 是一种多字节字符类型。 Unicode 是字符的编码方式。但我对它们感到困惑。

【问题讨论】:

  • 我不希望在 Delphi 6 中编译串联数组。如果数组以空值结尾(您的解决方法取决于),您可能会逃脱 str := string(arrChar_1) + string(arrChar_2); 或最坏的情况 str := string(@arrChar_1[0]) + string(@arrChar_2[1]);但是,出于性能原因,我可能会使用len1 := StrLen(arrChar_1); len2 := StrLen(arrChar_2); SetLength(str, len1 + len2); Move(arrChar_1, PChar(str)^, len1 * sizeof(Char)); Move(arrChar_2, (PChar(str) + len1)^, len2 * sizeof(Char)); 甚至str := Format('%s%s', [arrChar_1, arrChar_2]);
  • str := string(arrChar_1) + string(arrChar_2); 呢?
  • 这行得通:str := arrChar_1; str := str + arrChar_2;。好像是编译器错误,应该在QP上报告。

标签: delphi delphi-10.2-tokyo delphi-6


【解决方案1】:

以下在所有版本的 Delphi 中编译:

procedure Main;
var
  arrChar_1: array[0..2] of AnsiChar;
  arrChar_2: array[0..2] of AnsiChar;
  str: AnsiString;
begin
  str := arrChar_1 + arrChar_2;
end;

以下代码在 Unicode 版本的 Delphi 中无法编译:

procedure Main;
var
  arrChar_1: array[0..2] of WideChar;
  arrChar_2: array[0..2] of WideChar;
  str: UnicodeString;
begin
  str := arrChar_1 + arrChar_2;
end;

这对我来说似乎有点奇怪。为什么AnsiChar 数组应该支持连接运算符而不支持WideChar 数组?

如果您检查连接运算符是如何为 AnsiChar 数组实现的,就会开始有所启发。生成的代码首先将数组转换为ShortString 实例。然后将它们转换为 Delphi AnsiString 实例。最后连接两个AnsiString 实例。

现在,这可以解释为什么 WideChar 数组的代码会失败。 ShortString 类型仅支持 AnsiChar 元素,因此需要通过字符串支持例程的不同路径。可以假设 Embarcadero 设计人员在实现 Unicode 支持时出于某种原因选择不支持这种形式的连接。

要支持这个想法,请考虑以下几点:

procedure Main;
var
  arrChar_1: array[0..254] of AnsiChar;
  arrChar_2: array[0..254] of AnsiChar;
  str: AnsiString;
begin
  str := arrChar_1 + arrChar_2;
end;

这样编译。但是将254 上限更改为255 并且代码无法编译(在所有版本的Delphi 中)报告E2008 不兼容类型。这是因为数组现在超过了 ShortString 对象的最大长度。

至于如何将你的代码迁移到 Unicode Delphi,我建议你简单地将字符数组转换为string

str := string(arrChar_1) + string(arrChar_2);

【讨论】:

    猜你喜欢
    • 2012-10-16
    • 2015-06-25
    • 1970-01-01
    • 1970-01-01
    • 2011-02-07
    • 1970-01-01
    • 2014-06-08
    • 1970-01-01
    • 2012-05-03
    相关资源
    最近更新 更多