Delphi 为什么字符串常量即使完全由8位字符组成,也使用宽字符?
我刚刚发布了一个问题,关于$HIGHCHARUNICODE似乎是什么原因。 现在,默认$HIGHCHARUNICODE已关闭(Delphi XE2),这是为什么:Delphi 为什么字符串常量即使完全由8位字符组成,也使用宽字符?,delphi,delphi-xe2,Delphi,Delphi Xe2,我刚刚发布了一个问题,关于$HIGHCHARUNICODE似乎是什么原因。 现在,默认$HIGHCHARUNICODE已关闭(Delphi XE2),这是为什么: const AllLowByteValues =#$00#$01#$02#$03#$04#$05#$06#$07#$08#$09#$0a#$0b#$0c#$0d#$0e#$0f; AllHighByteValues=#$D0#$D1#$D2#$D3#$D4#$D5#$D6#$D7#$D8#$D9#$Da#$Db#$Dc#$Dd
const
AllLowByteValues =#$00#$01#$02#$03#$04#$05#$06#$07#$08#$09#$0a#$0b#$0c#$0d#$0e#$0f;
AllHighByteValues=#$D0#$D1#$D2#$D3#$D4#$D5#$D6#$D7#$D8#$D9#$Da#$Db#$Dc#$Dd#$De#$Df;
==> Sizeof(AllLowByteValues[1]) = 2
==> Sizeof(AllHighByteValues[1]) = 2
如果#$80的“所有十六进制#$xx 2位文字被解析为AnsiChar”#$FF,那么为什么所有HighByteValues都是unicode字符串而不是ANSIString?这是因为字符串常量是由UTF-16元素组成的 从: 字符串常量与PChar和PWideChar类型的赋值兼容,它们表示指向以null结尾的Char和WideChar值数组的指针
您没有考虑到在D2009+中字符串和字符文本是上下文敏感的。如果在Ansi上下文中使用文字,它将存储为Ansi。如果在Unicode上下文中使用文字,它将存储为Unicode
HIGHCHARUNICODE
仅适用于介于#128-#255之间的3位数字字符文字和介于#$80-#$FF之间的2位十六进制字符文字。这些特定值在Ansi和Unicode之间是模棱两可的,因此使用HIGHCHARUNICODE
来解决模棱两可的问题HIGHCHARUNICODE
不适用于其他类型的文字,包括字符串文字。如果将字符串或字符文本传递给SizeOf()
,则源代码中没有可供编译器使用的Ansi/Unicode上下文,因此它将使用Unicode上下文,除非在应用HIGHCHARUNICODE
的特定情况下,在这种情况下,如果禁用了HICHCHARUNICODE
,则使用Ansi上下文。这就是你看到的情况。谢谢。所有这些细节;-)我认为这些文本被解析为Ansi并转换为Unicode(因为默认的字符串类型是Unicode)。您的实验实际上并没有显示值是如何存储的。SizeOf表达式在编译时解析,实际上并不检查存储值。您需要显示您定义的字符串实际上作为WideChar值存储在EXE文件中。