我刚刚发布了一个关于Unicode character constants的问题,其中$ HIGHCHARUNICODE似乎是原因。 现在使用默认的$ HIGHCHARUNICODE OFF(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#$De#$Df;
==> Sizeof(AllLowByteValues[1]) = 2
==> Sizeof(AllHighByteValues[1]) = 2
如果“所有十六进制#$ xx 2位数文字被解析为AnsiChar”#80 ...#$ FF,那么为什么AllHighByteValues是unicode String而不是ANSIString?
答案 0 :(得分:1)
这是因为字符串常量是PChar
,因此由UTF-16元素组成。
字符串常量与PChar和PWideChar类型分配兼容,它们表示指向以空值终止的Char和WideChar值数组的指针。
答案 1 :(得分:1)
在D2009 +中,您没有考虑到字符串和字符文字是上下文相关的。如果在Ansi上下文中使用了文字,它将被存储为Ansi。如果在Unicode上下文中使用文字,则它将存储为Unicode。 HIGHCHARUNICODE
仅适用于#128-#255之间的3位数字字符文字和#$ 80之间的2位十六进制字符文字 - #$ FF。这些特定值在Ansi和Unicode之间是不同的,因此HIGHCHARUNICODE
用于解决这种不确定性。 HIGHCHARUNICODE
不适用于其他类型的文字,包括字符串文字。如果将字符串或字符文字传递给SizeOf()
,则源代码中没有Ansi / Unicode上下文供编译器使用,因此它将使用Unicode上下文,除非{{1适用,在这种情况下,如果HIGHCHARUNICODE
为OFF,则使用Ansi上下文。这就是你所看到的。