无法在Delphi 10.2中将char数组赋值给字符串
我有以下变量声明:
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,StrLen(first_arrChar)); str := str + Copy(second_arrChar,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; 以下代码不能在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,我建议您只需将字符数组转换为字符串: str := string(arrChar_1) + string(arrChar_2); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |