1

我刚刚发布了一个关于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 字符串而不是 ANSIString?

4

2 回答 2

1

那是因为字符串常量是PChar由 UTF-16 元素组成的。

文档中:

字符串常量与 PChar 和 PWideChar 类型的赋值兼容,它们表示指向以 null 结尾的 Char 和 WideChar 值数组的指针。

于 2012-09-06T11:39:19.297 回答
1

您没有考虑到字符串和字符文字在 D2009+ 中是上下文相关的。如果在 Ansi 上下文中使用文字,它将被存储为 Ansi。如果在 Unicode 上下文中使用文字,它将被存储为 Unicode。 HIGHCHARUNICODE仅适用于 #128-#255 之间的 3 位数字字符文字和 #$80-#$FF 之间的 2 位十六进制字符文字。这些特定值在 Ansi 和 Unicode 之间是模棱两可的,因此HIGHCHARUNICODE用于解决模棱两可的问题。 HIGHCHARUNICODE不适用于其他类型的文字,包括字符串文字。如果将 String 或 Character 文字传递给SizeOf(),则源代码中没有可供编译器使用的 Ansi/Unicode 上下文,因此它将使用 Unicode 上下文,除非在特定情况下HIGHCHARUNICODEHICHCHARUNICODE适用,在这种情况下,如果为 OFF,则使用 Ansi 上下文。这就是你所看到的发生。

于 2012-09-06T18:12:59.050 回答