Delphi &引用;元素数(256)与声明数(65536)不同;从D2007迁移到XE8

Delphi &引用;元素数(256)与声明数(65536)不同;从D2007迁移到XE8,delphi,unicode,Delphi,Unicode,我正在将代码从D2007迁移到XE8。我有一个使用此数据结构的函数: Map: array[Char] of Byte = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60,

我正在将代码从D2007迁移到XE8。我有一个使用此数据结构的函数:

Map: array[Char] of Byte = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 63, 52, 53,
  54, 55, 56, 57, 58, 59, 60, 61, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2,
  ..............
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0);
下面是它的用法(S是字符串):

当我尝试用XE8编译时,我得到一条消息

元素数量(256)不同于声明数量(65536)


我必须做些什么才能让它编译并使用XE8?

这是Delphi 2009中引入Unicode的结果。您可以通过将
Char
替换为
AnsiChar
或向数组中添加65280个新条目来解决此问题


在第一种情况下,您还应该注意,应该让
S
成为
AnsiString
,而不是(Unicode)
字符串
;否则,您可能会访问不存在的映射[chr(3653)]。

这是Delphi 2009中引入Unicode的结果。您可以通过将
Char
替换为
AnsiChar
或向数组中添加65280个新条目来解决此问题


在第一种情况下,您还应该注意,应该让
S
成为
AnsiString
,而不是(Unicode)
字符串
;否则,您可能会访问例如不存在的
Map[chr(3653)]

char
是字符类型的别名。在Unicode之前的版本中,Delphi
char
是8位
AnsiChar
类型的别名。在Unicode Delphi中,它是16位
WideChar
类型的别名。这就解释了编译错误


也许你实际上有二进制数据。在这种情况下,您应该停止使用字符串并使用字节数组。使用
byte
代替
char
。使用
TBytes
,一个动态字节数组
TArray
的别名,而不是字符串。使用字符串数据类型保存二进制数据的问题是字符串需要进行编码转换。二进制数据需要以二进制数据类型保存

char
是字符类型的别名。在Unicode之前的版本中,Delphi
char
是8位
AnsiChar
类型的别名。在Unicode Delphi中,它是16位
WideChar
类型的别名。这就解释了编译错误


也许你实际上有二进制数据。在这种情况下,您应该停止使用字符串并使用字节数组。使用
byte
代替
char
。使用
TBytes
,一个动态字节数组
TArray
的别名,而不是字符串。使用字符串数据类型保存二进制数据的问题是字符串需要进行编码转换。二进制数据需要以二进制数据类型保存

这两个选项都不可能使代码正常工作。@大卫:第二个选项是个笑话。第一个选项是否有效取决于OP对数组的操作。第一个选项不起作用,因为
S
是一个字符串。现在是UTF-16编码的。阿斯克似乎很高兴。@大卫:你说得很对;我已经更新了我的答案来解决这个问题。并不是说
S[3653]
不存在。如果
S[i]
WideChar
,那么
Map[S[i]]
就不会编译。这两个选项都不可能使代码正常工作。@David:第二个选项是个笑话。第一个选项是否有效取决于OP对数组的操作。第一个选项不起作用,因为
S
是一个字符串。现在是UTF-16编码的。阿斯克似乎很高兴。@大卫:你说得很对;我已经更新了我的答案来解决这个问题。并不是说
S[3653]
不存在。相反,如果
S[i]
WideChar
,那么
Map[S[i]]
就不会编译。这是一篇解释Unicode为什么对现代计算如此重要的相关文章。。。这是从2003年开始的。。。一篇解释为什么Unicode对现代计算如此重要的相关文章。。。这是从2003年开始的。。。或者一般理解字符串编码。
I := Map[S[1]] + (Map[S[2]] shl 6);