2012-09-06 65 views
1

我剛剛發佈了一個關於Unicode character constants的問題,其中$ HIGHCHARUNICODE似乎是原因。 現在用默認的$ HIGHCHARUNICODE OFF(德爾福XE2),這是爲什麼:即使完全由8位字符組成,字符串常量爲什麼使用寬字符?

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?

+1

我認爲這些文字被解析爲Ansi並轉換爲Unicode(因爲默認字符串類型是Unicode) – kludg

+0

您的實驗並未真正顯示如何存儲這些值。 SizeOf表達式在編譯時解析,並不實際檢查存儲的值。您需要顯示您定義的字符串實際上是作爲WideChar值*存儲在EXE文件*中的。 –

回答

1

這是因爲字符串常量爲PChar,因此由UTF-16元素組成。

documentation

字符串常量是分配兼容於PChar類型和PWideChar類型,其表示指針Char和WideChar值的空值終止陣列。

+0

謝謝。所有這些細節;-) –

1

您沒有考慮到字符串和字符文字在D2009 +中與上下文相關。如果在Ansi環境中使用文字,它將被存儲爲Ansi。如果在Unicode上下文中使用文字,它將以Unicode格式存儲。 HIGHCHARUNICODE僅適用於#128-#255之間的3位數字字符和#80至#$ FF之間的2位十六進制字符文字。這些特定的值在Ansi和Unicode之間是非常有效的,所以HIGHCHARUNICODE用於解決這個問題。 HIGHCHARUNICODE不適用於其他類型的文字,包括字符串文字。如果將字符串或字符文字傳遞給SizeOf(),則源代碼中沒有Ansi/Unicode上下文供編譯器使用,因此它將使用Unicode上下文,除非在適用HIGHCHARUNICODE的特定情況下,在這種情況下,如果HICHCHARUNICODE爲OFF,則使用Ansi上下文。這就是你所看到的事情。

相關問題