为什么字符串常量使用宽字符,即使完全由8位字符组成?

时间:2012-09-06 11:37:40

标签: delphi delphi-xe2

我刚刚发布了一个关于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?

2 个答案:

答案 0 :(得分:1)

这是因为字符串常量是PChar,因此由UTF-16元素组成。

来自documentation

  

字符串常量与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上下文。这就是你所看到的。