Delphi 在UnicodeChar和Integer之间键入强制转换是否安全?

Delphi 在UnicodeChar和Integer之间键入强制转换是否安全?,delphi,unicode,casting,Delphi,Unicode,Casting,在2009年以前的Delphi(ANSI land)中,您可以使用Ord和Chr将字符转换为字节,反之亦然。这很好,例如,当您需要将字符作为字节进行操作时: var ch: char; begin ch:= chr(ord(ch1) xor ord(ch2)); end; 显然,在较新的Delphis中,字符不再是一个字节,而是两个字节。然后进行类型转换是否安全: var ch: char; begin ch:= Char(integer(ch1) xor integer(ch

在2009年以前的Delphi(ANSI land)中,您可以使用
Ord
Chr
将字符转换为字节,反之亦然。这很好,例如,当您需要将字符作为字节进行操作时:

var
  ch: char;
begin
  ch:= chr(ord(ch1) xor ord(ch2));
end;
显然,在较新的Delphis中,字符不再是一个字节,而是两个字节。然后进行类型转换是否安全:

var
  ch: char;
begin
  ch:= Char(integer(ch1) xor integer(ch2));
end;

为了得到同样的结果?到目前为止,我所做的测试即使在使用西里尔文和阿拉伯语字符时也能正常工作,但你永远不知道。

根本不需要更改任何内容。继续像以前一样使用
ord()
chr()
。它们的工作方式与新的wide
char
类型完全相同。您的第一块代码仍然是用Unicode Delphi编写的惯用方法


尽管和的文档暗示这些函数使用
Byte
作为整数类型,但不要相信文档。这是错误的。

谢谢。我这样问是因为(至少在Delphi 2010中)用鼠标突出显示chr会显示工具提示:returns System.AnsiChar,当插入参数时,工具提示会说它需要一个字节)。但是你是对的,它的值似乎高于一个字节,并且给出了正确的字符。因此,对于Char和WideChar,整数类型是
Word
,但是对于AnsiChar,整数类型是
byte
?@JensMühlenhoff是的,这是我的信念。如果文档能够跟上进度,那就太好了。