无法将 char 数组分配给 Delphi 10.2 中的字符串
Can not assign char array to string in Delphi 10.2
我有以下变量声明:
arrChar_1: array[0..2] of Char;
arrChar_2: array[0..2] of Char;
str: string;
然后我做了作业:
str := arrChar_1 + arrChar_2;
这个赋值在Delphi6上正常运行。但是在Delphi10.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
在 Delphi 10.2:
String = UnicodeString
Char = WideChar
能告诉我是什么原因造成的不兼容问题吗? (2)
我了解到 widechar 是一种多字节字符类型。 Unicode 是字符的编码方式。但我对他们感到困惑。
以下编译在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;
以下代码无法在 Delphi 的 Unicode 版本中编译:
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);
我有以下变量声明:
arrChar_1: array[0..2] of Char;
arrChar_2: array[0..2] of Char;
str: string;
然后我做了作业:
str := arrChar_1 + arrChar_2;
这个赋值在Delphi6上正常运行。但是在Delphi10.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
在 Delphi 10.2:
String = UnicodeString
Char = WideChar
能告诉我是什么原因造成的不兼容问题吗? (2)
我了解到 widechar 是一种多字节字符类型。 Unicode 是字符的编码方式。但我对他们感到困惑。
以下编译在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;
以下代码无法在 Delphi 的 Unicode 版本中编译:
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);